Json 如何在spark中将WrappedArray转换为字符串?
我有一个包含嵌套数组的json文件,如下所示Json 如何在spark中将WrappedArray转换为字符串?,json,apache-spark,apache-spark-sql,spark-dataframe,Json,Apache Spark,Apache Spark Sql,Spark Dataframe,我有一个包含嵌套数组的json文件,如下所示 | | |-- coordinates: array (nullable = true) | | | |-- element: array (containsNull = true) | | | | |-- element: array (containsNull = true) | | | | | |-- element: array (containsNull =
| | |-- 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
字符串值吗?您可以使用UDF
将WrappedArray
展平,并将其设置为string
值
//udf
val concatArray = udf((value: Seq[Seq[Seq[Seq[Long]]]]) => {
value.flatten.flatten.flatten.mkString(",")
})
现在使用udf
创建/替换列作为
df1.withColumn("coordinates", concatArray($"coordinates") )
这将为您提供一个字符串,用分隔,“
替换WrappedArray
更新:如果您使用与带括号的字符串相同的格式,则可以执行以下操作
val concatArray = udf((value: Seq[Seq[Seq[Seq[Long]]]]) => {
value.map(_.map(_.map(_.mkString("[", ",", "]")).mkString("[", "", "]")).mkString("[", "", "]"))
})
输出:
[[[[1271700,6404100][1271700,6404200][1271600,6404200]]]]
希望这有帮助 我不知道包装数组,但您应该能够编写一个递归函数,返回您所需的内容。也许有一个更干净的选项tho。它是将整个坐标展平,但我想用方括号保持数组级别。后一种坐标用于在地图中绘制多边形。因此需要保持级别。由于两个级别的扁平化,它将永远无法保持我在帖子中提到的正确级别[[[[12717006404100],[12717006404200],[1271606404200]][13212224433]]我猜根据您提供的模式,两个级别的扁平化应该可以工作。或者您希望像[[12717006404100],[12717006404200],[1271600,6404200]][13212224433]]]
这是字符串。也就是说,是的,你是对的。更具体地说,我希望将此数据作为字符串存储在配置单元中,而不是复杂的数据类型。但我希望保留[因为它来自原始数据]。