我正在尝试使用结构化流从Kafka读取数据。从kafka接收的数据为json格式。 我的代码如下: 在代码中,我使用from_json函数将json转换为数据帧以进行进一步处理。
val **schema**: StructType = new StructType()
.add("time", LongType)
.add(id", LongType)
.add("properties",new StructType()
.add("$app_version", StringType)
.
.
)
val df: DataFrame = spark.readStream
.format("kafka")
.option("kafka.bootstrap.servers","...")
.option("subscribe","...")
.load()
.selectExpr("CAST(value AS STRING) as value")
.select(from_json(col("value"), **schema**))
我的问题是,如果增加字段, 我无法停止spark程序来手动添加这些字段, 那么我该如何动态解析这些字段,我尝试了 schema_of_json(), 只能使用第一行来推断字段类型,并且不适用于多层嵌套结构的json数据。
答案 0 :(得分:0)
我的问题是,如果增加了字段,则无法停止spark程序手动添加这些字段,那么如何动态解析这些字段
开箱即用的Spark结构化流(甚至Spark SQL)是不可能的。不过,有两种解决方案。
您只需要停止流查询,更改代码以匹配当前架构,然后恢复它即可。在Spark结构化流中,可以使用支持从检查点恢复的数据源。 Kafka数据源确实支持它。
您可以编写一个用户定义函数(UDF),该函数将为您执行此动态JSON解析。这也是最简单的选择之一。
另一个选择是创建对内置Kafka数据源的扩展,该扩展将执行动态JSON解析(类似于Kafka反序列化器)。这需要更多的开发,但是肯定是可行的。