使用具有常量值的var在Spark DataFrame中创建新列

时间:2018-06-07 05:21:47

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

我正在尝试使用定义为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")

欢迎任何建议 - 提前感谢您的帮助。

1 个答案:

答案 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"))

这应该快得多。