我正在尝试使用定义为var
的常量在Spark DataFrame中定义新列。我正在使用Zeppelin - 在初始单元格中,它以
%spark
import org.apache.spark.sql.functions._
var year : Int = 2016
spark.read.parquet("<path/to/file>")
该文件包含名为birth_year的列;我想创建一个名为age
的新列,其定义为$year - birth_year
,其中birth_year
是一个字符串列。当UDF
的输入参数是参数时,我不太清楚如何执行此操作。我已经完成了几个小时的搜索并创建了UDF
,但是我收到了一条错误消息,其主要部分是
<console>:71: error: type mismatch;
found : Int
required: org.apache.spark.sql.Column
spark.read.parquet("path/to/file").withColumn("birth_year", $"birth_year" cast "Int").withColumn("age", createAge(year, col("birth_year"))).createOrReplaceTempView("tmp")
和直接在'年'下的插入符号。
我怀疑$year
没有映射到与birth_year
相同长度的变量;我已经看到了lit()
函数似乎适用于字符串 - 它是否也适用于整数值,还是有另一个函数用于此目的?
我尝试了以下内容:
%spark
import org.apache.spark.sql.functions._
var year : Int = 2016
def createAge = udf((yr : Int, dob : Int) => {yr - dob})
spark.read.parquet("<path/to/file>").withColumn("birth_year", $"birth_year" cast "Int").withColumn("age", createAge($"year", col("birth_year"))).createOrReplaceTempView("tmp")
欢迎任何建议 - 提前感谢您的帮助。
答案 0 :(得分:1)
您无法直接使用year
作为UDF
的输入,因为它希望列能够进行操作。要创建具有常量值的列,请使用lit()
。您可以按以下方式拨打UDF
:
df.withColumn("age", createAge(lit(year), $"birth_year".cast("int")))
但是,如果可能的话,在可能的情况下总是首选使用Spark中的内置函数。在这种情况下,您不需要UDF
。只需:
df.withColumn("age", lit(year) - $"birth_year".cast("int"))
这应该快得多。