如何访问嵌套属性而不在pyspark json中传递父属性

t2a7ltrp  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(241)

我正在尝试使用pyspark访问以下json的内部属性

[
 {
    "432": [
        {
            "atttr1": null,
            "atttr2": "7DG6",
            "id":432,
            "score": 100
        }
    ]
},
 {
    "238": [
        {
            "atttr1": null,
            "atttr2": "7SS8",
            "id":432,
            "score": 100
        }
    ]
}
]

在输出中,我正在寻找csv atttr1、atttr2、id、score null、“7dg6”、432100 null、“7ss8”、238100等形式的内容
我知道我可以得到这些细节如下,但我不想通过432或238在lambda表达式,因为在更大的json这个(斜体)将有所不同。我想迭代所有可用的值。

print(inputDF.rdd.map(lambda x:(x['*432*'])).first())
print(inputDF.rdd.map(lambda x:(x['*238*'])).first())

我还尝试注册一个名为“test”的临时表,但它给出了一个消息元素错误。\u id不存在。

inputDF.registerTempTable("test")
srdd2 = spark.sql("select element._id from test limit 1")

任何帮助都将不胜感激。我用的是spark 2.4

yacmzcpb

yacmzcpb1#

不使用Pypark功能,您可以这样做:

data = json.loads(json_str)  # or whatever way you're getting the data

columns = 'atttr1 atttr2 id score'.split()
print(','.join(columns))  # headers

for item in data:
    for obj in list(item.values())[0]:  # since each list has only one object
        print(','.join(str(obj[col]) for col in columns))

输出:

atttr1,atttr2,id,score
None,7DG6,432,100
None,7SS8,432,100

for item in data:
    obj = list(item.values())[0][0]  # since the object is the one and only item in list
    print(','.join(str(obj[col]) for col in columns))

仅供参考,您可以将其存储在变量中,或将其写入csv而不是/并打印它。
如果您只是想将其转储到csv,请参阅以下答案。

相关问题