从用户定义的函数创建火花数据框列

Posted

技术标签:

【中文标题】从用户定义的函数创建火花数据框列【英文标题】:Create a spark dataframe column from a user defined function 【发布时间】:2019-02-28 05:13:26 【问题描述】:

这应该是微不足道的 - 但我错过了一些东西:

import org.apache.spark.sql._
import org.apache.spark.functions._

val rand = new java.util.Random(42)
val zipUdf = udf( () => 10000 +  rand.nextInt(200))

val zdf = df.withColumn("postalCode",col(zipUdf))

直接使用udf显然是不正确的:

found   : org.apache.spark.sql.expressions.UserDefinedFunction
 required: org.apache.spark.sql.Column

需要什么魔法?

更新:我已经尝试过以下方法:

 val zdf = df.withColumn("postalCode",zipUdf)

真正的问题应该是zipUdf() 而不是zipUdf

【问题讨论】:

【参考方案1】:

一切顺利:

val someDF = Seq((0, "hello"), (1, "world")).toDF("id", "text")    
import org.apache.spark.sql.functions.udf   
val rand = new java.util.Random(42)
val zipUdf = udf(() => 10000 +  rand.nextInt(200))

someDF.withColumn("postalCode", zipUdf()).show

上面代码的输出:

+---+-----+----------+
| id| text|postalCode|
+---+-----+----------+
|  0|hello|     10130|
|  1|world|     10163|
+---+-----+----------+

col()withColumn 一起使用是失败的主要原因。

【讨论】:

哦 - 我知道发生了什么我还没有parens zipUdf()【参考方案2】:

您不需要将它包装在 col() 中。下面的代码应该可以工作。

val zdf = df.withColumn("postalCode",zipUdf())

【讨论】:

啊问题是我没有parens【参考方案3】:

问题(如错误所示)是zipUdf 的类型为UserDefinedFunction,而withColumn 函数需要Column。您需要实际调用zipUdf 函数来获取Column,即使用()

val zdf = df.withColumn("postalCode", zipUdf())

【讨论】:

我忽略了括号。

以上是关于从用户定义的函数创建火花数据框列的主要内容,如果未能解决你的问题,请参考以下文章

Databricks - 创建永久用户定义函数 (UDF)

如何截断火花数据框列的值? [复制]

数据类型转换火花数据框列 - pyspark

在 VBA 中访问选择组合框列返回“函数未定义”-错误

将多个火花数据框列转换为具有列表类型的单列

将火花数据框列中的值提取到新的派生列中