![](/img/trans.png)
[英]writing corrupt data from kafka / json datasource in spark structured streaming
[英]Writing data as JSON array with Spark Structured Streaming
我必须将 Spark Structure 流中的数据写入 JSON 数组,我尝试使用以下代码:
df.selectExpr("to_json(struct(*)) AS value").toJSON
它返回我 DataSet [String],但无法写入 JSON 数组。
当前 Output:
{"name":"test","id":"id"}
{"name":"test1","id":"id1"}
预期 Output:
[{"name":"test","id":"id"},{"name":"test1","id":"id1"}]
编辑(将评论移入问题):
使用建议collect_list
方法后,我得到了
Exception in thread "main" org.apache.spark.sql.AnalysisException: Append output mode not supported when there are streaming aggregations on streaming DataFrames/DataSets without watermark;
然后我尝试了这样的事情 -
withColumn("timestamp", unix_timestamp(col("event_epoch"), "MM/dd/yyyy hh:mm:ss aa")) .withWatermark("event_epoch", "1 minutes") .groupBy(col("event_epoch")) .agg(max(col("event_epoch")).alias("timestamp"))
但我不想添加新列。
您可以为此使用 SQL 内置 function collect_list 。 此 function 收集并返回一组非唯一元素(与仅返回唯一元素的collect_set
相比)。
从collect_list的源代码中,您将看到这是一个聚合 function。 根据Output 模式的结构化流编程指南中给出的要求,强调 output 模式“完整”和“更新”支持无水印的聚合。
我从您的评论中了解到,您不希望添加水印和新列。 此外,您面临的错误
Exception in thread "main" org.apache.spark.sql.AnalysisException: Append output mode not supported when there are streaming aggregations on streaming DataFrames/DataSets without watermark;
提醒您不要使用 output 模式“追加”。
在评论中,您提到您计划将结果生成到 Kafka 消息中。 一个大的 JSON 数组作为一个 Kafka 值。 完整的代码可能看起来像
val df = spark.readStream
.[...] // in my test I am reading from Kafka source
.load()
.selectExpr("CAST(key AS STRING) as key", "CAST(value AS STRING) as value", "offset", "partition")
// do not forget to convert you data into a String before writing to Kafka
.selectExpr("CAST(collect_list(to_json(struct(*))) AS STRING) AS value")
df.writeStream
.format("kafka")
.outputMode("complete")
.option("kafka.bootstrap.servers", "localhost:9092")
.option("topic", "test")
.option("checkpointLocation", "/path/to/sparkCheckpoint")
.trigger(Trigger.ProcessingTime(10000))
.start()
.awaitTermination()
给定键/值对 (k1,v1)、(k2,v2) 和 (k3,v3) 作为输入,您将在 Kafka 主题中获得一个值,其中包含作为 JSON 数组的所有选定数据:
[{"key":"k1","value":"v1","offset":7,"partition":0}, {"key":"k2","value":"v2","offset":8,"partition":0}, {"key":"k3","value":"v3","offset":9,"partition":0}]
使用 Spark 3.0.1 和 Kafka 2.5.0 进行测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.