通过用户定义的函数创建spark数据框列

时间:2019-02-28 05:13:27

标签: scala apache-spark apache-spark-sql user-defined-functions

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分: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一起使用是失败的主要原因。