转换复杂的json

时间:2018-09-07 13:01:52

标签: scala apache-spark pyspark

我有一个包含3列的配置单元表:id,event_time,payload

payload值是一个非常复杂的json文档,其中包含数十个嵌套的数组和映射,如下所示。 elem1..elemN可以是嵌套数组,也可以是下面带有其他嵌套元素的映射。

{
    "entry":[
        {"resource": {
            "eventType": "typeA",
            "elem1": "value",
            ...
            "elemN": "valueN"
        }
        }
    ],
    "meta": {
        "elem1": 123,
    }
}

我想将此数据集转换为如下所示的数据框,理想情况下,我不想为这些嵌套资源预先定义架构(它们确实非常复杂)。

id,event_time,event_typeA,... event_typeN

event_type来自entry.resource.eventType。例如,如果我的有效载荷看起来像这样:

{
    "entry":[
        {"resource": {
            "eventType": "typeA",
            "elem1": "value",
            ...
            "elemN": "valueN"
        }
        },
        {"resource": {
            "eventType": "typeA",
            "elem1": "value",
            ...
            "elemN": "valueN"
        }
        },
        {"resource": {
            "eventType": "typeB",
            "elem1": "value",
            ...
            "elemN": "valueN"
        }
        },
        {"resource": {
            "eventType": "typeC",
            "elem1": "value",
            ...
            "elemN": "valueN"
        }
        }

    ],
    "meta": {
        "elem1": 123,
    }
}

当所有事件类型都转换为数据帧上的一行时,我想获得类似的信息。对于一个给定的有效负载,可能有多个event_type,并且在单个有效负载中可能有多个event_type实例。

id      event_time              typeA                               typeB                                       typeC
123     2011-01-01 01:20:00     
                                [
                                    {"resource": {
                                        "eventType": "typeA",
                                        "elem1": "value",
                                        ...
                                        "elemN": "valueN"
                                    }
                                    },
                                    {"resource": {
                                        "eventType": "typeA",
                                        "elem1": "value",
                                        ...
                                        "elemN": "valueN"
                                    }
                                ]


                                                                {"resource": {
                                                                    "eventType": "typeB",
                                                                    "elem1": "value",
                                                                    ...
                                                                    "elemN": "valueN"
                                                                }
                                                                                                                {"resource": {
                                                                                                                    "eventType": "typeC",
                                                                                                                    "elem1": "value",
                                                                                                                    ...
                                                                                                                    "elemN": "valueN"
                                                                                                                }
                                                                                                                }         

0 个答案:

没有答案