Spark UDF 不工作:如何指定应用它的列?

Spark UDF not working: how to specify the column on which to apply it?

假设我有我的 DataFrame,其中给定的列名为 "X"。我想了解为什么第一个代码不起作用而第二个代码起作用。对我来说,它没有改变任何东西。

一方面,这行不通:

val dataDF = sqlContext
      .read
      .parquet(input_data)
      .select(
          "XXX", "YYY", "III"
      )
      .toDF(
          "X", "Y", "I"
      )
      .groupBy(
          "X", "Y"
      )
      .agg(
          sum("I").as("sum_I")
      )
      .orderBy(desc("sum_I"))
      .withColumn("f_sum_I", udf((x: Long) => f(x)).apply(dataDF("sum_I")))
      .drop("sum_I")

dataDF.show(50, false)

IntelliJ 没有编译我的代码,我有以下错误:

Error:(88, 67) recursive value dataDF needs type
      .withColumn("f_sum_I", udf((x: Long) => f(x)).apply(dataDF("sum_I")))

另一方面,如果我用这个改变给定的行,这个工作:

.withColumn("f_sum_I", udf((x: Long) => f(x)).apply(col("sum_I")))

我所做的只是将对 DataFrame 列的调用替换为使用更通用的函数 "col"。我不明白其中的区别,尤其是为什么它不喜欢第一种方法(使用 DataFrame 的名称)。

您在完成定义之前尝试使用 dataDF - dataDF 是以 sqlContext.read 开头并以 [=14= 结尾的整个表达式的结果], 所以你不能在那个表达式中使用它。

您可以通过简单地引用列而不使用 DataFrame 来解决这个问题,例如使用 org.apache.spark.sql.functions 中的 col 函数:

.withColumn("f_sum_I", udf((x: Long) => f(x)).apply(col("sum_I")))