
[英]Spark SQL - Scala - Aggregate Function as Parameter to Create DF Column
[英]How to pass df column as parameter to the function?
我写下面的功能
object AgeClassification {
def AgeCategory(age:Int) : String = {
if(age<=30)
return "Young"
else if(age>=65)
return "Older"
else
return "Mid-age"
}
}
我正在尝试将dataframe列作为参数传递
val df_new = df
.withColumn("Age_Category", AgeClassification.AgeCategory(df("age")))
但是得到错误
:33:错误:类型不匹配;
找到:org.apache.spark.sql.Column
要求:整数
val df_new = df.withColumn(“ Age_Category”,AgeClassification.AgeCategory(df(“ age”)))
如何将列作为参数传递?
val df_new = df
.withColumn("Age_Category",AgeClassification.AgeCategory(df.age.cast(IntegerType)))
:33:错误:值年龄不是org.apache.spark.sql.DataFrame的成员
val df_new = df.withColumn(“ Age_Category”,AgeClassification.AgeCategory(df.age.cast(IntegerType)))
val df_new = df
.withColumn("Age_Category", AgeClassification.AgeCategory(df("age").cast(Int)))
:33:错误:方法重载值与替代方法:
(至:字符串)org.apache.spark.sql.Column
(发送至:org.apache.spark.sql.types.DataType)org.apache.spark.sql.Column
不能应用于(Int.type)
val df_new = df.withColumn(“ Age_Category”,AgeClassification.AgeCategory(df(“ age”)。cast(Int)))
使用SparkSQL API操纵数据框时,不能直接使用scala函数。 您只能使用在Column
类或functions
类中定义的“列”函数。 他们基本上将列转换为列。 实际计算在Spark中处理。
为了说明这一点,您可以在REPL中尝试一下:
scala> df("COL1").cast("int")
res6: org.apache.spark.sql.Column = CAST(COL1 AS INT)
类型是Column
,而不是int
,这就是为什么scala拒绝在这样的对象上应用您的函数(使用整数)。
要使用自定义函数,您需要将其包装在UDF中,如下所示:
val ageUDF = udf((age : Int) => AgeClassification.AgeCategory(age))
// or shorter
val ageUDF = udf(AgeClassification.AgeCategory _)
// The you may use it this way:
df.withColumn("classif", ageUDF(df("age")))
另请注意, df.age
可在pyspark中使用,但它不是有效的ni scala。 对于通过名称访问列的一种简短方法,可以导入spark.implicits._
并输入$"age"
或更短的'age
。
import org.apache.spark.sql.Column
def AgeCategory(age:Column) : String
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.