从数据块中的数组列获取数据,无需交叉连接

2024-06-22

假设我有一张桌子:

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(使用前将#替换为@)

从数据块中的数组列获取数据,无需交叉连接 的相关文章

随机推荐