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")))
假设我有我的 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")))