替换Spark数据帧中Array [long]中的分隔符

时间:2017-12-11 03:30:52

标签: scala apache-spark apache-spark-sql

我正在将一个JSON文件读入Scala中的spark数据框。我有一个像

这样的JSON字段
"areaGlobalIdList":[2389,3,2,1,2147,2142,2518]

Spark会自动将此字段的数据类型推断为Array [long]。我试过concat_ws,但似乎只适用于array [string]。当我尝试将其转换为数组[string]时,输出显示为

scala> val cmrdd = sc.textFile("/user/nkthn/cm.json")
scala> val cmdf = sqlContext.read.json(cmrdd)
scala> val dfResults = cmdf.select($"areaGlobalIdList".cast(StringType)).withColumn("AREAGLOBALIDLIST", regexp_replace($"areaGlobalIdList" , ",", "." ))
scala> dfResults.show(20,false)
+------------------------------------------------------------------+
|AREAGLOBALIDLIST                                                  |
+------------------------------------------------------------------+
|org.apache.spark.sql.catalyst.expressions.UnsafeArrayData@6364b584|
+------------------------------------------------------------------+

我期待输出

[2389.3.2.1.2147.2142.2518]

任何帮助都非常有帮助。

1 个答案:

答案 0 :(得分:2)

schema列的areaGlobalIdList视为

 |-- areaGlobalIdList: array (nullable = true)
 |    |-- element: long (containsNull = false)

您可以使用简单的udf函数

来实现此目的
import org.apache.spark.sql.functions._
val concatWithDot = udf((array: collection.mutable.WrappedArray[Long]) => array.mkString("."))

df.withColumn("areaGlobalIdList", concatWithDot($"areaGlobalIdList")).show(false)