假设我有一张桌子:
id |
array_col |
101 |
[{"system": "x", "value": "1"}, {"system": "y", "value": "2"},{"system": "z", "value": "3"}] |
其中 array_col 基本上包含一个结构数组
0:{“系统”:“x”,“值”:“1”}
1:{“系统”:“y”,“值”:“2”}
2:{“系统”:“z”,“值”:“3”}
我需要如下表的输出:
id |
system |
value |
101 |
x |
1 |
101 |
y |
2 |
101 |
z |
3 |
现在我正在尝试在子查询中使用explode(因为不能在单个select语句中进行多个explode,然后根据id将它们连接起来。但这给了我一个输出,其中每个系统都显示每个值,所以我得到了 9 个结果,而不是 3 个。
id |
system |
value |
101 |
x |
1 |
101 |
x |
2 |
101 |
x |
3 |
101 |
y |
1 |
101 |
y |
2 |
101 |
y |
3 |
101 |
z |
1 |
101 |
z |
2 |
101 |
z |
3 |
帮我得到 3 行的输出,而不是 9 行。
Try inline
:
df.selectExpr('id', 'inline(array_col)').show()
+---+------+-----+
| id|system|value|
+---+------+-----+
|101| x| 1|
|101| y| 2|
|101| z| 3|
+---+------+-----+
上面假设数组包含结构,而不是字符串形式的结构。如果你的结构是字符串,你需要用from_json
first:
df2 = df.selectExpr(
'id', 'explode(array_col) array_col'
).selectExpr(
'id', "inline(array(from_json(array_col, 'struct<system:string, value:string>')))"
)
df2.show()
+---+------+-----+
| id|system|value|
+---+------+-----+
|101| x| 1|
|101| y| 2|
|101| z| 3|
+---+------+-----+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)