pyspark 使用python动态扁平化json,所有嵌套键在一列中,值在另一列中

fkvaft9z  于 2023-02-03  发布在  Spark
关注(0)|答案(1)|浏览(156)

我需要使用pyspark/python将json扁平化为键和值,这样所有嵌套的键都会进入一个列值中,而相应的值则会进入另一个列中。
同样要注意的是input json是动态的,所以在下面的例子中可能有多个子键和子键。如果有人能在这方面提供帮助,我们将不胜感激
示例json输入:

{
    "key1": {
        "subkey1":"1.1",
        "subkey2":"1.2"
        },
    "key2": {
        "subkey1":"2.1",
        "subkey2":"2.2",
        "subkey3": {"child3": { "subchild3":"2.3.3.3" } }
}
}

预期输出:
| 识别号|键|价值|
| - ------|- ------|- ------|
| 1个| key1.subkey1 |1.1节|
| 第二章| key1.subkey2 |第1.2条|
| 三个| key2.subkey1 |二、一|
| 四个| key2.subkey2 |二、二|
| 五个| key2.subkey3.child3.subchild3 |2.3.3.3|

41zrol4v

41zrol4v1#

下面的代码为您提供了完成所需的全部内容:

data = \
  { "key1": {
         "subkey1":"1.1",
         "subkey2":"1.2"
            },

    "key2": {
        "subkey1":"2.1",
        "subkey2":"2.2",
        "subkey3": {
                    "child3": { 
                               "subchild3":"2.3.3.3" 
                              } 
                   }
          }
  }
print(data)
ID      = 0
lstRows = []
def getTableRow(data, key):
    global lstRows, ID
    for k, v in data.items():
        #print('for k,v:', k,v)
        if isinstance(v, dict):
            #print('dict:',v)
            if key=='': 
                getTableRow(v, k)
            else:
                getTableRow(v, key +'.'+ k)
        else:
            #print('lstRows.append()')
            ID += 1
            lstRows.append({"ID":ID, "key":key +'.'+ k, "value":v})
getTableRow(data, '') 
print( lstRows )
dctTable = {"ID":[],"key":[], "value":[]}
for dct in lstRows:
    dctTable["ID"].append(dct["ID"])
    dctTable["key"].append(dct["key"])
    dctTable["value"].append(dct["value"])
print( dctTable )

import pandas as pd
df = pd.DataFrame.from_dict(dctTable)
# df = pd.DataFrame(lstRows)  # equivalent to above .from_dict()
# df = pd.DataFrame(dctTable) # equivalent to above .from_dict()
print(df)

印刷品

{'key1': {'subkey1': '1.1', 'subkey2': '1.2'}, 'key2': {'subkey1': '2.1', 'subkey2': '2.2', 'subkey3': {'child3': {'subchild3': '2.3.3.3'}}}}
[{'ID': 1, 'key': 'key1.subkey1', 'value': '1.1'}, {'ID': 2, 'key': 'key1.subkey2', 'value': '1.2'}, {'ID': 3, 'key': 'key2.subkey1', 'value': '2.1'}, {'ID': 4, 'key': 'key2.subkey2', 'value': '2.2'}, {'ID': 5, 'key': 'key2.subkey3.child3.subchild3', 'value': '2.3.3.3'}]
{'ID': [1, 2, 3, 4, 5], 'key': ['key1.subkey1', 'key1.subkey2', 'key2.subkey1', 'key2.subkey2', 'key2.subkey3.child3.subchild3'], 'value': ['1.1', '1.2', '2.1', '2.2', '2.3.3.3']}
   ID                            key    value
0   1                   key1.subkey1      1.1
1   2                   key1.subkey2      1.2
2   3                   key2.subkey1      2.1
3   4                   key2.subkey2      2.2
4   5  key2.subkey3.child3.subchild3  2.3.3.3

它使用递归调用函数来创建结果表的行。
由于我不使用pyspark,所以所示表格是使用Pandas创建的。
另请参见here(“Flatten nested dictionary,compressing key”),了解一种通用且灵活的方法,用于扁平化嵌套字典,同时处理列表值。

相关问题