PySpark中如何将JSON字段的键及对应数组值完全展开为多行
实现方案
你需要在json_each拆出键值对后,再对数组类型的值调用json_array_elements做二次展开即可,完整查询语句如下:
SELECT json_each.key AS "Key", arr.elements AS "Value" FROM your_table, json_each(xref_json::json), json_array_elements(json_each.value) AS arr(elements);
逻辑说明
- 第一层
json_each(xref_json::json)已经实现了将JSON的每个键和对应的数组拆分为独立行,此时返回的value字段就是你当前拿到的完整数组 - 第二层
json_array_elements接收数组类型输入,会将数组的每个元素拆为单独的行,和上层的键关联后即可得到「键+单个数组元素」的一对一结构
可选优化
如果你需要返回的Value是不带双引号的纯字符串,可以将json_array_elements替换为json_array_elements_text:
SELECT json_each.key AS "Key", arr.elements AS "Value" FROM your_table, json_each(xref_json::json), json_array_elements_text(json_each.value) AS arr(elements);
效果示例
针对你给出的两条测试数据,执行上述语句后会返回如下结构的结果:
| Key | Value |
|---|---|
| XXX | 123 |
| XXX | 456 |
| YYY | 246 |
| YYY | 135 |
| XXX | 123 |
| XXX | 456 |
| YYY | 246 |
| YYY | 135 |
| ZZZ | 333 |
| ZZZ | 444 |
内容的提问来源于stack exchange,提问作者Shan。
相关产品推荐
相关产品推荐

