从Kafka读取的Apache Spark 2.4结构流在应用多次转换后始终为二进制结构

时间:2018-11-14 11:19:52

标签: apache-spark apache-kafka spark-structured-streaming

我正在使用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...|

预期输出应该是具有多列的数据帧

我在做错什么吗? 任何帮助将不胜感激。

谢谢

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。