用于动态键字段的Spark JSON模式?

时间:2019-02-27 13:24:43

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

我使用from_json()方法从kafka接收JSON数据。它期望我提供模式。我的JSON结构是这样;

{
    "Items": {
        "key1": [
            {
                "id": "",
                "name": "",
                "val": ""
            }
        ],
        "key2": [
            {
                "id": "",
                "name": "",
                "val": ""
            }
        ],
        "key3": [
            {
                "id": "",
                "name": "",
                "val": ""
            }
        ]
    }
}

在这种状态下; key1, key2, key3个字段未知。因此,它们是dynamic。这些字段的名称可能是"abc", "def"等。如何在Spark结构化流中为此JSON定义JSON模式?

编辑: 例如另一个json;

{
        "Items": {
            "stack": [
                {
                    "id": "",
                    "name": "",
                    "val": ""
                }
            ],
            "over": [
                {
                    "id": "",
                    "name": "",
                    "val": ""
                }
            ],
            "flow": [
                {
                    "id": "",
                    "name": "",
                    "val": ""
                }
            ]
        }
    }

2 个答案:

答案 0 :(得分:2)

您需要定义架构以解析此类json文件。您的架构应如下所示。

val valSchema = new StructType()
  .add("id", StringType)
  .add("name", StringType)
  .add("val", StringType)

val valArrSchema = new ArrayType(valSchema, true)
val mapSchema = new MapType(StringType, valArrSchema, true)
val jsonSchema =  new StructType().add("Items", mapSchema)

您可以使用from_json方法解析json。

val testDF = df.withColumn("json", from_json(col("value"),jsonSchema ))

答案 1 :(得分:0)

key1key2key3未提交。它们是关键的价值!此处的字段为idnamevaluekeykey的值可以是动态的,没关系,这里没有复杂性。