Scala 如何解决DataSet.toJSON与结构化流媒体不兼容的问题
我想把推特上的数据写入卡夫卡。出于教育目的,我尝试使用结构化流媒体来实现这一点。我已经创建了一个基于socket源代码的Twitter源代码,它运行良好 我将我的来源设置为:Scala 如何解决DataSet.toJSON与结构化流媒体不兼容的问题,scala,apache-spark,apache-kafka,spark-structured-streaming,Scala,Apache Spark,Apache Kafka,Spark Structured Streaming,我想把推特上的数据写入卡夫卡。出于教育目的,我尝试使用结构化流媒体来实现这一点。我已经创建了一个基于socket源代码的Twitter源代码,它运行良好 我将我的来源设置为: val tweets = spark .readStream .format("twitter") .option("query", terms) .load() .as[SparkTweet] 这为我提供了一个很好的分析查询数据集。太好了 接下来,我想将每个tweet以略微稀疏的模式保存到Kafka
val tweets = spark
.readStream
.format("twitter")
.option("query", terms)
.load()
.as[SparkTweet]
这为我提供了一个很好的分析查询数据集。太好了
接下来,我想将每个tweet以略微稀疏的模式保存到Kafka中:
val kafkaOutStream = tweets
.toJSON.as("value")
.writeStream
.queryName("stream_to_kafka")
.outputMode(OutputMode.Append())
.trigger(Trigger.ProcessingTime("1 second"))
.format("kafka")
.option("kafka.bootstrap.servers","localhost:9092")
.option("topic","tweets")
.start
那很容易!除了,它不起作用。在QueryExecution.scala
中,调用传递到assertSupported
中,并最终被抛出,因为
Exception in thread "main" org.apache.spark.sql.AnalysisException:
Queries with streaming sources must be executed with writeStream.start();;
我没想到toJSON
会是一个纯粹的批处理操作,但如果没有它,使用sayselect($“text”作为“value”)
,代码就会正常工作
现在,我有点目瞪口呆,希望有人能解释为什么toJSON不应该与流媒体兼容(这是一个bug吗?一个缺失的特性?),并说明是否有一种结构化流式方式可以将我的对象的序列化表示形式获取到Kafka中。这有点冗长,但是
to_json
函数应该起到以下作用:
import org.apache.spark.sql.functions.{to_json, struct, col}
tweets.select(to_json(struct(df.columns map col: _*)).alias("value"))
.writeStream
...
toJSON
的问题似乎是:
而且(正如in所指出的)似乎已经在开发版本中解决了。Cool,这似乎解决了这个问题。希望sql.functions和DataSet API在不久的将来能够为结构化流媒体实现更高程度的奇偶性。@RickMoritz似乎已经在master上解决了这个问题:@user6910411我认为编辑的标题不能正确地表示问题的内容。毕竟,问题和答案都是关于DataFrame.toJSON及其在特定版本Spark中的实现细节。
val rdd: RDD[String] = queryExecution.toRdd.mapPartitions { iter =>
...