Pyspark中的JSON解析

2024-09-29 02:24:15 发布

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

在一个有两列(my_col和ID)和多条记录的表中,下面是两条示例记录

记录1:第1列-my_col值为:{"XXX": ["123","456"],"YYY": ["246","135"]},第2列-ID为A123

记录2:第1列-我的列值为:{"ZZZ":["333"]},第2列-ID为B222

需要使用pyspark展平:

^{tb1}$

你能帮我解决这个问题吗

仅供参考。。。在Hive中实现了以下结果:


select split(element,':')[0] key,
       e.value,
       id
from
(
SELECT 
 regexp_replace(e.element,'^\\{|"| *\\[|\\]|\\}$','') element, 
 t.id 
FROM
    input_df t
    lateral view explode(split(my_col,'(?<=\\]) *, *(?=\\")')) e as element 
)s lateral view explode(split(split(element,':')[1],',')) e as value 

Tags: viewid示例valuemyas记录col
1条回答
网友
1楼 · 发布于 2024-09-29 02:24:15

这里的技巧是将JSON列强制转换为map,并分解所有值,直到将其平坦化

import pyspark.sql.functions as f


input_df = spark.createDataFrame([
  ['A123', '{"XXX": ["123","456"],"YYY": ["246","135"]}'],
  ['B222', '{"ZZZ":["333"]}']
], schema='id string, my_col string')

output_df = (input_df
             .withColumn('entries', f.from_json('my_col', 'map<string, array<string>>'))
             .select('id', f.explode('entries'))
             .select('ID', 'Key', f.explode('value').alias('Value')))

output_df.show(truncate=False)
+  + -+  -+
|ID  |Key|Value|
+  + -+  -+
|A123|XXX|123  |
|A123|XXX|456  |
|A123|YYY|246  |
|A123|YYY|135  |
|B222|ZZZ|333  |
+  + -+  -+

相关问题 更多 >