【问题标题】:Converting an Array[Double] Column into a string or two different columns with Spark Dataframe Scala使用 Spark Dataframe Scala 将 Array[Double] 列转换为字符串或两个不同的列
【发布时间】:2015-11-16 22:18:54
【问题描述】:

我之前遇到了障碍,试图在 Spark Dataframes 中进行一些转换。

假设我有一个架构数据框:

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

我想摆脱坐标中的数组(双),而是得到一个看起来像行的 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 来做到这一点。

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    您可以使用 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"))
    

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 2016-11-01
      • 2019-05-10
      • 1970-01-01
      相关资源
      最近更新 更多