在Spark中解析嵌套的JSON列

时间:2019-03-21 06:14:55

标签: json apache-spark

我有一个下面的示例数据,作为一个数据框

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解决此问题。

1 个答案:

答案 0 :(得分:2)

假设要基于已经计算的b列拥有details数组的第一个元素,只需选择b的第一个元素:

 dataframe.withColumn("details", expr("details.b[0]"))

您还可以直接在getField的结果上使用getItemfrom_json函数

dataframe.withColumn("details",from_json($"data",StructType(Seq(StructField("b",ArrayType(StringType),true)))).getField("b").getItem(0))