Structured Streaming中如何解析Kafka传入的JSON数据的Schema
在实际生产中消息中的字段可能会发生变化,比如多加一个字段什么的,但是Spark程序又不能停下来,所以考虑在程序中不是自定义好Schema,而是通过Kafka输入消息中json串来infer Schema。当然,也可以通过广播变量来更新配置文件,定期更新Schema,这也是一种写法
在之前Spark Streaming中解析kafka的json格式数据时,采用的也是Schema infer来推断,如下
dStream.map(_.value).foreachRDD(rdd=>{
...
val spark = SparkSession.builder().config(rdd.sparkContext.getConf).getOrCreate()
val df = spark.read.json(spark.createDataSet(rdd))
...
})
这样通过解析json字符串,可以直接把json串的key作为DataFrame的Columns列名
但是Structured Streaming中是直接生成DataFrame的,这样做就不行。翻了下api发现了一个从json字符串推断Schema的方法——schema_of_json
/**
* Parses a JSON string and infers its schema in DDL format.
*
* @param json a JSON string.
*
* @group collection_funcs
* @since 2.4.0
*/
def schema_of_json(json: String): Column = schema_of_json(lit(