Pyspark JSON将对象数组放入列中

2024-09-30 01:31:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将JSON文件摄取到spark中,在文件的嵌套JSON中遇到了一个对象,如下所示

"data": {
  "key1" :"v1" 
  "key2" : [
     {"nk1" :"nv1"}, 
     {"nk2" :"nv2" }, 
     {"nk3" :"nv3" } 
  ] 
}

在spark中读取后,它将更改为以下格式:

"data": {
  "key1" :"v1" 
  "key2" : [
     {"nk1" :"nv1", "nk2" :null, "nk3" :null}, 
     {"nk1" :null, "nk2" :"nv2", "nk3" :null}, 
     {"nk1" :null, "nk2" :null, "nk3" :"nv3"} 
  ] 
}

我需要它们作为spark数据框中的列

^{tb1}$

请帮我解决这个问题。我正在考虑将其转换为字符串并使用正则表达式。有没有更好的解决办法


Tags: 文件对象jsondatanullsparkv1key2
1条回答
网友
1楼 · 发布于 2024-09-30 01:31:55

可以分解阵列和轴键2:

import pyspark.sql.functions as F

df2 = df.select(
    F.col('data.key1').alias('key1'), 
    F.explode('data.key2').alias('key2')
).select(
    'key1', 
    F.map_keys('key2')[0].alias('key'), 
    F.map_values('key2')[0].alias('val')
).groupBy('key1').pivot('key').agg(F.first('val'))

df2.show()
+  + -+ -+ -+
|key1|nk1|nk2|nk3|
+  + -+ -+ -+
|  v1|nv1|nv2|nv3|
+  + -+ -+ -+

相关问题 更多 >

    热门问题