考虑groupBy
上的基本DataFrame
表达式:
val groupDf = rsdf.groupBy("league","vendor").agg(mean('league),mean('vendor))
groupBy
部分很好:它使用字符串作为列名。但是,agg
(/ mean
)不是 - 因为这里显然不支持Symbol
。
我想知道为什么Symbol
在这里不起作用 - 以及它们 在Spark SQL中是否允许。
答案 0 :(得分:3)
简短的回答是从不。没有DataFrame
方法直接支持Symbols
。
很长的答案是无处不在,Spark编译器期望Column
,但你需要在范围内有其他对象。
符号完全起作用的唯一原因是从Symbol
隐式转换为Column
提供SQLImplicits.implicits
。
导入后,只要需要Symbol
,编译器就能投出Column
,包括agg
(并且隐含在范围内):
import spark.implicits._
import org.apache.spark.sql.functions._
val df = Seq((1, 2)).toDF("league", "vendor")
df.groupBy("league","vendor").agg(mean('league),mean('vendor)).show
+------+------+-----------+-----------+
|league|vendor|avg(league)|avg(vendor)|
+------+------+-----------+-----------+
| 1| 2| 1.0| 2.0|
+------+------+-----------+-----------+