Spark sql中什么时候可以使用符号来表示列?

jav*_*dba 4 apache-spark apache-spark-sql

考虑 a 的基本groupBy表达式DataFrame

val groupDf  = rsdf.groupBy("league","vendor").agg(mean('league),mean('vendor))
Run Code Online (Sandbox Code Playgroud)

groupBy部分很好:它使用字符串作为列名。然而agg(/ mean) 不是-因为显然Symbol这里不支持。

我想知道为什么Symbol's 在这里不起作用 - 以及 Spark SQL 何时允许它们。

hi-*_*zir 5

简短的回答是永远不会。没有直接DataFrame支持的方法Symbols

Spark 编译器期望的地方Column都是长答案,但您需要范围内的其他对象。

符号起作用的唯一原因是从SymbolColumn提供的隐式转换SQLImplicits.implicits

导入后,编译器将能够SymbolColumn需要时进行强制转换,包括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|
+------+------+-----------+-----------+
Run Code Online (Sandbox Code Playgroud)