我有一个json文件,其中包含嵌套数组,如下所示,
| | |-- coordinates: array (nullable = true)
| | | |-- element: array (containsNull = true)
| | | | |-- element: array (containsNull = true)
| | | | | |-- element: array (containsNull = true)
| | | | | | |-- element: long (containsNull = true)
我用Spark来读取json并爆炸了数组。
explode(col("list_of_features.geometry.coordinates"))
返回如下值,
WrappedArray(WrappedArray(WrappedArray(1271700, 6404100), WrappedArray(1271700, 6404200), WrappedArray(1271600, 6404200), WrappedArray(1271600, 6404300),....
但原始输入看起来没有WrappedArray。
之类的,
[[[[1271700,6404100],[1271700, 6404200],[1271600, 6404200]
最终目标是在csv文件中存储没有WrappedArray
(可能是字符串)的坐标,以便Hive读取数据。
爆炸之后是否有任何方法可以只用方括号括起来的坐标。
或者我可以使用replace来替换RDD中的WrappedArray
字符串值吗?
答案 0 :(得分:1)
您可以UDF
使用flatten
WrappedArray
并将String
值设为
//udf
val concatArray = udf((value: Seq[Seq[Seq[Seq[Long]]]]) => {
value.flatten.flatten.flatten.mkString(",")
})
现在使用udf
创建/替换列
df1.withColumn("coordinates", concatArray($"coordinates") )
这应该会为您string
分隔","
替换WrappedArray
更新:如果您使用与括号相同的string
格式,那么您可以这样做
val concatArray = udf((value: Seq[Seq[Seq[Seq[Long]]]]) => {
value.map(_.map(_.map(_.mkString("[", ",", "]")).mkString("[", "", "]")).mkString("[", "", "]"))
})
输出:
[[[[1271700,6404100][1271700,6404200][1271600,6404200]]]]
希望这有帮助!