Spark UDF无法正常工作:如何指定要应用它的列?

时间:2017-08-30 13:25:52

标签: scala apache-spark spark-dataframe user-defined-functions

我们说我有我的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的名称)。

1 个答案:

答案 0 :(得分:2)

在您完成定义之前,您尝试使用dataDF - dataDF是整个表达式的结果,以sqlContext.read开头,以.drop("sumI")结尾,所以你不能在那个表达中使用它。

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

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