Apache Spark:Kafka以自定义格式编写

时间:2018-11-17 15:45:49

标签: json apache-spark apache-kafka apache-spark-sql

我正在构建一个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查询的结果。

这可能吗?怎么样?谢谢!

1 个答案:

答案 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