繁体   English   中英

如何将df列作为参数传递给函数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM