我正在使用Apache Spark 2.4,在对流查询进行多次转换后,我正在从kafka读取json数据,最终输出仍然是二进制。
val streamingDF = sparkSession.readStream
.format("kafka")
.option("subscribe", "test")
.option("startingOffsets", "latest")
.option("failOnDataLoss", value = false)
.option("maxOffsetsPerTrigger", 50000L)
.option("kafka.bootstrap.servers", "kafka_server")
.option("enable.auto.commit" , "false")
.load()
val dataSet = streamingDF.selectExpr("CAST(value AS STRING)").as[String]
val stream = dataSet.map{value => convertJSONToCaseClass(value)}
.map{data => futherconvertions(data)}.writeStream.format("console")
.outputMode(OutputMode.Update()).start()
此后,我将在控制台上获得类似的输出。
Batch: 8
-------------------------------------------
+--------------------+
| value|
+--------------------+
|[01 00 63 6F 6D 2...|
|[01 00 63 6F 6D 2...|
|[01 00 63 6F 6D 2...|
预期输出应该是具有多列的数据帧
我在做错什么吗? 任何帮助将不胜感激。
谢谢
答案 0 :(得分:0)
不建议您按照docs设置“ enable.auto.commit”。请参考kafka特定配置 https://spark.apache.org/docs/2.4.0/structured-streaming-kafka-integration.html 您也可以尝试以下操作:
val streamingDF = sparkSession.readStream
.format("kafka")
.option("subscribe", "test")
.option("startingOffsets", "latest")
.option("failOnDataLoss", value = false)
.option("maxOffsetsPerTrigger", 50000L)
.option("kafka.bootstrap.servers", "kafka_server")
.load()
val df = streamingDF.selectExpr("CAST(value as STRING)")
val mySchema = StructType(Array(
StructField("X", StringType, true),
StructField("Y", StringType, true),
StructField("Z", StringType, true))
val Resultdf = df.select(from_json($"value", mySchema).as("data")).select("data.*")
答案 1 :(得分:0)
Spark 2.4不支持多重聚合链。
another SO thread https://spark.apache.org/docs/2.4.0/structured-streaming-programming-
多个流式聚合(即, 流数据集尚不支持流DF。