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