Scala 使用具有常量值的变量在Spark数据帧中创建新列

Scala 使用具有常量值的变量在Spark数据帧中创建新列,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我试图使用定义为var的常量在Spark数据帧中定义一个新列。我在使用齐柏林飞艇-在最初的牢房里,它从 %spark import org.apache.spark.sql.functions._ var year : Int = 2016 spark.read.parquet("<path/to/file>") 和直接位于“年”下的插入符号 我怀疑$year没有映射到与出生年份长度相同的变量中;我已经看到了lit()函数,该函数似乎适用于字符串-它是否也适用于整数值,或者是否有其

我试图使用定义为
var
的常量在Spark数据帧中定义一个新列。我在使用齐柏林飞艇-在最初的牢房里,它从

%spark
import org.apache.spark.sql.functions._
var year : Int = 2016
spark.read.parquet("<path/to/file>")
和直接位于“年”下的插入符号

我怀疑
$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")
%spark
导入org.apache.spark.sql.functions_
风险值年份:Int=2016
def createAge=udf((yr:Int,dob:Int)=>{yr-dob})
spark.read.parquet(“”)。带列(“出生年”,“出生年”铸造“Int”)。带列(“年龄”,createAge($“年”,颜色(“出生年”))。createOrReplaceTempView(“tmp”)

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

您不能将
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"))
这应该快得多。

可能会重复
df.withColumn("age", lit(year) - $"birth_year".cast("int"))