使用 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"))
我早些时候遇到了一个障碍,试图在 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"))