为什么不接受Scala的符号作为列引用?

时间:2014-09-09 13:03:47

标签: scala apache-spark-sql

尝试使用Spark SQL的示例,除非需要表达式,否则它们似乎运行良好:

scala> val teenagers = people.where('age >= 10).where('age <= 19).select('name)
<console>:23: error: value >= is not a member of Symbol
       val teenagers = people.where('age >= 10).where('age <= 19).select('name)

scala> val teenagers = people.select('name)
<console>:23: error: type mismatch;
 found   : Symbol
 required: org.apache.spark.sql.catalyst.expressions.Expression
       val teenagers = people.select('name)

似乎我需要一个没有记录的导入。

如果我批量导入所有内容

import org.apache.spark.sql.catalyst.analysis._
import org.apache.spark.sql.catalyst.dsl._
import org.apache.spark.sql.catalyst.errors._
import org.apache.spark.sql.catalyst.expressions._
import org.apache.spark.sql.catalyst.plans.logical._
import org.apache.spark.sql.catalyst.rules._ 
import org.apache.spark.sql.catalyst.types._
import org.apache.spark.sql.catalyst.util._
import org.apache.spark.sql.execution
import org.apache.spark.sql.hive._

编辑:......和

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext._

它有效。

2 个答案:

答案 0 :(得分:4)

您缺少隐式转换。

val sqlContext: org.apache.spark.sql.SQLContext = ???
import sqlContext._

然而,最近(并支持)版本的Spark已经发生了变化。

答案 1 :(得分:4)

Spark 2.0&#39;这里SparkSession取代了SQLContext

Scala的Symbol类型和Spark SQL Column的隐式转换在范围内不可用。

在您创建了SparkSession个实例之后,执行import以确定范围内的含义。

val spark: SparkSession = ...
import spark.implicits._

请参阅scaladoc of implicits object

它会自动导入spark-shell,并且您无需进行此明确导入。