Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何在spark中将WrappedArray转换为字符串?_Json_Apache Spark_Apache Spark Sql_Spark Dataframe - Fatal编程技术网

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

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 =

我有一个包含嵌套数组的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
字符串值吗?

您可以使用
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]]]
这是字符串。也就是说,是的,你是对的。更具体地说,我希望将此数据作为字符串存储在配置单元中,而不是复杂的数据类型。但我希望保留[因为它来自原始数据]。