我正在构建一个Spark SQL应用程序,该应用程序从Kafka主题中使用,转换一些数据,然后使用特定的JSON对象写回单独的Kafka主题。
我已经完成了大部分工作-我可以使用,转换并写回Kafka-这是我在苦苦挣扎后要编写的JSON对象的形状。
现在,我可以查询/转换我想要的内容并将其编写:
Dataset<Row> reader = myData.getRecordCount();
reader.select(to_json(struct("record_count")).alias("value"))
.write()
.format("kafka")
.option("kafka.bootstrap.servers", "localhost:9092")
.option("topic", "new_separate_topic")
.save();
这将在主题中产生这样的记录:
{
"record_count": 989
}
我需要的是让这部分JSON成为较大JSON对象的有效负载(子)属性,我们将其用作微服务的标准使用者对象。
我要写给主题的内容实际上是这样的:
{
"id": "ABC123",
"timestamp": "2018-11-16 20:40:26.108",
"user": "DEF456",
"type": "new_entity",
"data": {
"record_count": 989
}
}
此外,“ id”,“ user”和“ type”字段将从外部填充-它们来自触发整个过程的原始Kafka消息。基本上,我需要为要写入Kafka的元数据/对象注入一些值,并将“数据”字段设置为上述Spark SQL查询的结果。
这可能吗?怎么样?谢谢!
答案 0 :(得分:1)
如果要添加新字段,则不能仅选择一个。
例如在write.format("kafka")
和.select()
之间,您需要执行something like withColumn()
Dataset<Row> reader = myData.getRecordCount();
// Keep your DataSet as Columns
reader = reader.select("record_count"))
// Add more data
reader = reader.withColumn(...)
// Then convert structs to JSON and write the output
reader.select(to_json(...))
.write()
.format("kafka")
“ id”,“ user”和“ type”字段将从外部填充-它们来自触发整个过程的原始Kafka消息
然后,您需要在代码中包含select("id", "user", "type")
另一种选择是使用Kafka Streams而不是被迫操纵数据集,您可以使用实际的Java类/ JSONObjects