是否有可能将流式的o.a.s.sql.Dataset
转换为DStream
?如果可以,如何转换?
我知道如何将其转换为RDD,但这是在流式处理的上下文中。
是否有可能将流式的o.a.s.sql.Dataset
转换为DStream
?如果可以,如何转换?
我知道如何将其转换为RDD,但这是在流式处理的上下文中。
这是不可能的。结构化流和遗留的 Spark 流(DStreams
)使用完全不同的语义,彼此不兼容,因此:
DStream
无法转换为流式 Dataset
。Dataset
无法转换为 DStream
。在某些用例中,这是可能的。
这个问题实际上引出了另一个问题:
为什么有人想要进行这种转换?要解决的问题是什么?
我只能想象这种类型转换仅在将两个不同的API混合到单个流应用程序中时才需要。那么我会说这没有太多意义,因为您最好不要这样做,并在Spark模块级别进行转换,即将流应用程序从Spark Streaming迁移到Spark Structured Streaming。
流Dataset
是一系列Datasets
的“抽象”(我使用引号,因为流和批处理Dataset
之间的区别是Dataset
的isStreaming
属性)。
可以将DStream
转换为流Dataset
,以使后者表现为前者(保持DStream
的行为并假装成为流Dataset
)。
在底层,Spark Streaming(DStream
)和Spark Structured Streaming(流式Dataset
)的执行引擎非常相似。它们都会“生成”RDD和Dataset的微批次;而RDD可以转换为Dataset,但需要使用隐式转换toDF
或toDS
。
因此,将DStream
转换为流式Dataset
看起来应该如下:
dstream.foreachRDD { rdd =>
val df = rdd.toDF
// this df is not streaming, but you don't really need that
}