【问题标题】:How to convert WrappedArray to string in spark?如何将 WrappedArray 转换为 spark 中的字符串?
【发布时间】:2018-04-12 09:01:50
【问题描述】:

我有一个包含嵌套数组的 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]

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

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

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

【问题讨论】:

  • 我不知道包装数组,但你应该能够编写一个递归函数来返回你需要的东西。也许有一个更清洁的选择。

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


【解决方案1】:

您可以使用UDFflatten 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]]]]

希望这会有所帮助!

【讨论】:

  • 将整个坐标展平,但我想用方括号来维护数组级别。该坐标稍后用于在地图中绘制多边形。所以需要保持水平。
  • 由于两级展平,它永远不会保持我在帖子中提到的水平正确 [[[[1271700,6404100],[1271700, 6404200],[1271600, 6404200]][132122 ,24433]]]
  • 我猜根据您提供的架构,两级 flatten 应该可以工作。
  • 或者你想要像[[[[1271700,6404100],[1271700, 6404200],[1271600, 6404200]][132122,24433]]] 这样的字符串。即用beackets?
  • 是的,你是对的。更具体地说,我想将此数据作为字符串存储在配置单元中,而不是复杂的数据类型。但我想保持 [ 因为它来自原始数据。
猜你喜欢
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 2017-06-13
  • 2019-07-25
  • 2020-12-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多