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

时间:2017-08-02 15:48:27

标签: apache-spark apache-spark-sql

考虑groupBy上的基本DataFrame表达式:

val groupDf  = rsdf.groupBy("league","vendor").agg(mean('league),mean('vendor))

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

我想知道为什么Symbol在这里不起作用 - 以及它们 在Spark SQL中是否允许。

1 个答案:

答案 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|
+------+------+-----------+-----------+