我想将来自Kafka的传入JSON数据转换为数据框。
我正在通过Scala 2.12
大多数人都添加了硬编码模式,但是如果json可以具有其他字段,则需要每次更改代码库,这很繁琐。
一种方法是将其写入文件并进行推断,但我宁愿避免这样做。
还有其他方法可以解决此问题吗?
编辑:找到了一种将json字符串转换为数据帧但无法从流源中提取它的方法,有可能提取它吗?
答案 0 :(得分:1)
一种方法是将架构本身存储在消息头中(而不是键或值中)。
尽管这样会增加消息的大小,但无需任何外部资源(例如文件或架构注册表)即可轻松解析JSON值。
新消息可以具有新的架构,而旧消息仍然可以使用其旧架构本身进行处理,因为该架构位于消息本身之内。
或者,您可以 version 个模式,并在消息头中为每个模式包含一个id
(或)中的 magic字节键或值并从那里推断架构。
此方法后接Confluent Schema registry。它使您基本上可以浏览同一架构的不同版本,并查看您的架构随着时间的变化。
答案 1 :(得分:0)
以字符串形式读取数据,然后将其转换为map [string,String],这样您就可以在不知道其模式的情况下处理任何json
答案 2 :(得分:0)
基于JavaTechnical答案,最好的方法是使用架构注册表, 使用avro数据而不是json,目前尚无法对模式进行硬编码。
将您的模式名称和ID作为标头,并使用它们从模式注册表中读取模式。
使用from_avro
功能将数据转换为df!