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

How to convert WrappedArray to string in spark?

我有一个 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"))

其中returns值如下,

WrappedArray(WrappedArray(WrappedArray(1271700, 6404100), WrappedArray(1271700, 6404200), WrappedArray(1271600, 6404200), WrappedArray(1271600, 6404300),....

但原始输入看起来像没有 WrappedArray。

有点像,

[[[[1271700,6404100],[1271700, 6404200],[1271600, 6404200]

最终目的是将没有WrappedArray的坐标(可能是String)存储在csv文件中,供Hive读取数据。

explode 之后有没有办法只用适当的方括号括起来的坐标。

或者我可以使用 replace 来替换 RDD 中的 WrappedArray 字符串值吗?

您可以使用 UDFflatten WrappedArray 并将其 String 值设为

//udf
val concatArray = udf((value:  Seq[Seq[Seq[Seq[Long]]]]) => {
  value.flatten.flatten.flatten.mkString(",")
})

现在使用 udf 将 create/replace 列作为

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

希望对您有所帮助!