我有一个下面的示例数据,作为一个数据框
id|data
1,{"a":["xyz","x"],"b":["abc","ab"]}
2,{"a":["zy","y"],"b":["ac","bc"]}
这是我的预期输出:
id|details
1,abc
2,ac
这是我到目前为止所拥有的,
dataframe.withColumn("details",from_json($"data",StructType(Seq(StructField("b",ArrayType(StringType),true)))))
这是我现在得到的输出
1,[abc,ab]
2,[ac,bc]
此外,这只是一个示例,我有100多个列,因此无法使用select子句。想要使用withColumn解决此问题。
答案 0 :(得分:2)
假设要基于已经计算的b
列拥有details
数组的第一个元素,只需选择b
的第一个元素:
dataframe.withColumn("details", expr("details.b[0]"))
您还可以直接在getField
的结果上使用getItem
和from_json
函数
dataframe.withColumn("details",from_json($"data",StructType(Seq(StructField("b",ArrayType(StringType),true)))).getField("b").getItem(0))