如何将WrappedArray转换为spark中的字符串?

时间:2018-04-12 09:01:50

标签: json apache-spark apache-spark-sql spark-dataframe

我有一个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字符串值吗?

1 个答案:

答案 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]]]]

希望这有帮助!