结构化流如何动态解析kafka的json数据

时间:2019-10-15 03:25:51

标签: json apache-spark spark-structured-streaming

我正在尝试使用结构化流从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数据。

1 个答案:

答案 0 :(得分:0)

  

我的问题是,如果增加了字段,则无法停止spark程序手动添加这些字段,那么如何动态解析这些字段

开箱即用的Spark结构化流(甚至Spark SQL)是不可能的。不过,有两种解决方案。

更改代码中的架构并恢复流查询

您只需要停止流查询,更改代码以匹配当前架构,然后恢复它即可。在Spark结构化流中,可以使用支持从检查点恢复的数据源。 Kafka数据源确实支持它。

用户定义功能(UDF)

您可以编写一个用户定义函数(UDF),该函数将为您执行此动态JSON解析。这也是最简单的选择之一。

新数据源(MicroBatchReader)

另一个选择是创建对内置Kafka数据源的扩展,该扩展将执行动态JSON解析(类似于Kafka反序列化器)。这需要更多的开发,但是肯定是可行的。