如何将流数据集转换为 DStream?

How to convert streaming Dataset to DStream?

是否可以将流媒体 o.a.s.sql.Dataset 转换为 DStream?如果可以,怎么做?

我知道如何将它转换为 RDD,但它是在流式上下文中。

这是不可能的。 Structured Streaming 和旧版 Spark Streaming (DStreams) 使用完全不同的语义并且彼此不兼容,因此:

  • DStream 无法转换为 Streaming Dataset.
  • 流式传输 Dataset 无法转换为 DStream

这是可能的(在某些用例中)。

这个问题真的是另一个问题:

Why would anyone want to do that conversion? What's the problem to be solved?

我只能想象这种 type 转换只有在单个流应用程序中混合两种不同的 API 时才需要。然后我会说这没有多大意义,因为您宁愿不这样做并在 Spark 模块级别进行转换,即将流应用程序从 Spark Streaming 迁移到 Spark Structured Streaming。

流式 Dataset 是一系列 Datasets 中的一个 "abstraction" (我使用引号是因为流式和批处理 Dataset 之间的区别是 isStreaming 属性 一个 Dataset).

可以将 DStream 转换为流 Dataset,这样后者的行为与前者相同(以保持 DStream 的行为并假装是流 Dataset).

在幕后,Spark Streaming (DStream) 和 Spark Structured Streaming (streaming Dataset) 的执行引擎非常相似。它们分别是 "generate" 微批次的 RDD 和数据集。并且 RDD 可以转换为数据集,但是这种隐式转换 toDFtoDS.

因此将 DStream 转换为流 Dataset 在逻辑上看起来如下:

dstream.foreachRDD { rdd =>
  val df = rdd.toDF
  // this df is not streaming, but you don't really need that
}