从databricks中的数组列获取数据,而不交叉连接

c6ubokkw  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(213)

假设我有一张table:
idarray\u col101[{“system”:“x”,“value”:“1”},{“system”:“y”,“value”:“2”},{“system”:“z”,“value”:“3”}]
其中array\u col基本上包含一个结构数组
0:{“system”:“x”,“value”:“1”}
1:{“system”:“y”,“value”:“2”}
2:{“system”:“z”,“value”:“3”}
我需要如下表所示的输出:
IDS系统值101x1101y2101z3
现在我正在尝试在子查询中使用explode(因为不能在一个select语句中使用多个explode,然后根据id连接它们。但是这给了我一个输出,每个系统显示每个值,所以我得到的结果不是3个,而是9个。
IDS系统值101X1101X2101X3101Y1101Y210Y3101Z101Z2101Z3
帮助我获得3行而不是9行的输出。

41ik7eoe

41ik7eoe1#

尝试 inline :

df.selectExpr('id', 'inline(array_col)').show()
+---+------+-----+
| id|system|value|
+---+------+-----+
|101|     x|    1|
|101|     y|    2|
|101|     z|    3|
+---+------+-----+

上面假设数组包含结构,而不是作为字符串的结构。如果你的结构是字符串,你需要用 from_json 第一:

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|
+---+------+-----+

相关问题