【问题标题】:How to pass df column as parameter to the function?如何将 df 列作为参数传递给函数?
【发布时间】:2019-08-21 17:09:02
【问题描述】:

我在下面写了函数

object AgeClassification {
  def AgeCategory(age:Int) : String = {
    if(age<=30)
      return "Young" 
    else if(age>=65)
      return "Older" 
    else
      return "Mid-age"
  }
}

我正在尝试将数据框列作为参数传递

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: 错误:值 age 不是 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: 错误:重载的方法值强制转换:
(to: String)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)))

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    在使用 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

    【讨论】:

      【解决方案2】:
      import org.apache.spark.sql.Column
      
      def AgeCategory(age:Column) : String
      

      【讨论】:

      • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。
      猜你喜欢
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      相关资源
      最近更新 更多