使用 Spark Dataframe Scala 将 Array[Double] 列转换为字符串或两个不同的列

Converting an Array[Double] Column into a string or two different columns with Spark Dataframe Scala

我早些时候遇到了一个障碍,试图在 Spark Dataframes 中进行一些转换。

假设我有一个模式数据框:

root
|-- coordinates: array (nullable = true)
|    |-- element: double (containsNull = true)
|-- userid: string (nullable = true)
|-- pubuid: string (nullable = true)

我想去掉坐标中的 array(double),取而代之的是得到一个 DF,其行看起来像

"coordinates(0),coordinates(1)", userid, pubuid 
                   or something like 
 coordinates(0), coordinates(1), userid, pubuid . 

使用 Scala 我可以做到

coordinates.mkString(",")

但在 DataFrames 中坐标解析为 java.util.List。

到目前为止,我解决了这个问题,方法是读入一个 RDD,转换然后构建一个新的 DF。但我想知道是否有更优雅的方法来使用 Dataframes 来做到这一点。

感谢您的帮助。

您可以使用 UDF:

import org.apache.spark.sql.functions.{udf, lit}

val mkString = udf((a: Seq[Double]) => a.mkString(", "))
df.withColumn("coordinates_string", mkString($"coordinates"))

val apply = udf((a: Seq[Double], i: Int) => a(i))
df.select(
  $"*", 
  apply($"coordinates", lit(0)).alias("x"),
  apply($"coordinates", lit(1)).alias("y")
)

编辑:

在最近的版本中您还可以使用concat_ws:

import org.apache.spark.sql.functions.concat_ws

df.withColumn(
  "coordinates_string", concat_ws(",", $"coordinates")
)

或简单的Column.apply:

df.select($"*", $"coordinates"(0).alias("x"), $"coordinates"(1).alias("y"))