从用户定义的函数创建火花数据框列
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
一起使用是失败的主要原因。
【讨论】:
哦 - 我知道发生了什么我还没有parenszipUdf()
【参考方案2】:
您不需要将它包装在 col() 中。下面的代码应该可以工作。
val zdf = df.withColumn("postalCode",zipUdf())
【讨论】:
啊问题是我没有parens【参考方案3】:问题(如错误所示)是zipUdf
的类型为UserDefinedFunction
,而withColumn
函数需要Column
。您需要实际调用zipUdf
函数来获取Column
,即使用()
:
val zdf = df.withColumn("postalCode", zipUdf())
【讨论】:
我忽略了括号。以上是关于从用户定义的函数创建火花数据框列的主要内容,如果未能解决你的问题,请参考以下文章