使用结构化流处理来自kafka的json数据

时间:2020-06-26 14:47:16

标签: json scala apache-kafka schema spark-structured-streaming

我想将来自Kafka的传入JSON数据转换为数据框。

我正在通过Scala 2.12

使用结构化流

大多数人都添加了硬编码模式,但是如果json可以具有其他字段,则需要每次更改代码库,这很繁琐。

一种方法是将其写入文件并进行推断,但我宁愿避免这样做。

还有其他方法可以解决此问题吗?

编辑:找到了一种将json字符串转换为数据帧但无法从流源中提取它的方法,有可能提取它吗?

3 个答案:

答案 0 :(得分:1)

  1. 一种方法是将架构本身存储在消息头中(而不是键或值中)。

    尽管这样会增加消息的大小,但无需任何外部资源(例如文件或架构注册表)即可轻松解析JSON值。

    新消息可以具有新的架构,而旧消息仍然可以使用其旧架构本身进行处理,因为该架构位于消息本身之内。

  2. 或者,您可以 version 个模式,并在消息头中为每个模式包含一个id(或)中的 magic字节键或值并从那里推断架构。

    此方法后接Confluent Schema registry。它使您基本上可以浏览同一架构的不同版本,并查看您的架构随着时间的变化。

答案 1 :(得分:0)

以字符串形式读取数据,然后将其转换为map [string,String],这样您就可以在不知道其模式的情况下处理任何json

答案 2 :(得分:0)

基于JavaTechnical答案,最好的方法是使用架构注册表, 使用avro数据而不是json,目前尚无法对模式进行硬编码。

将您的模式名称和ID作为标头,并使用它们从模式注册表中读取模式。

使用from_avro功能将数据转换为df!