【问题标题】:How to apply a function to a column of a Spark DataFrame?如何将函数应用于 Spark DataFrame 的列?
【发布时间】:2016-01-05 14:37:12
【问题描述】:

假设我们有一个 Spark DataFrame

df.getClass
Class[_ <: org.apache.spark.sql.DataFrame] = class org.apache.spark.sql.DataFrame

使用以下架构

df.printSchema
root
|-- rawFV: string (nullable = true)
|-- tk: array (nullable = true)
|    |-- element: string (containsNull = true)

鉴于tk列的每一行都是一个字符串数组,如何编写一个Scala函数来返回每行元素的数量?

【问题讨论】:

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


    【解决方案1】:

    您不必编写自定义函数,因为有一个:

    import org.apache.spark.sql.functions.size
    
    df.select(size($"tk"))
    

    如果你真的想要你可以写一个udf:

    import org.apache.spark.sql.functions.udf
    
    val size_ = udf((xs: Seq[String]) => xs.size)
    

    甚至创建自定义表达式,但实际上没有任何意义。

    【讨论】:

    • 完美!一般而言,我想知道如何将 UDF 应用于数据帧。你能给我举个简单的例子吗?
    • 在 SO (a couple of examples) 上有几十个示例,并且一如既往地源代码(尤其是测试)是一个很好的起点。
    • 你会如何使用这个 size_ 函数?
    • 与内置sizesize_($"tk"))的方式相同。
    • 如果我想用 def 定义 size_ 怎么办?我知道这可能看起来有点矫枉过正,但这样很容易换成别的东西。
    【解决方案2】:

    一种方法是使用下面的 sql 访问它们。

    df.registerTempTable("tab1")
    val df2 = sqlContext.sql("select tk[0], tk[1] from tab1")
    
    df2.show()
    

    要获取数组列的大小,

    val df3 = sqlContext.sql("select size(tk) from tab1")
    df3.show()
    

    如果您的 Spark 版本较旧,您可以使用 HiveContext 代替 Spark 的 SQL 上下文。

    我也会尝试一些穿越的东西。

    【讨论】:

      猜你喜欢
      • 2016-05-15
      • 2017-10-18
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 2019-06-26
      相关资源
      最近更新 更多