spark-shell:导入奇怪的行为

iva*_*ler 6 shell scala apache-spark scala-repl

我正在使用spark-shell(Spark版本2.1.0,使用Scala版本2.11.8,OpenJDK 64位服务器VM,1.7.0_151).

我导入Column类:

scala> import org.apache.spark.sql.Column
import org.apache.spark.sql.Column
Run Code Online (Sandbox Code Playgroud)

我可以定义一个Column对象:

scala> val myCol: Column = col("blah")
myCol: org.apache.spark.sql.Column = blah
Run Code Online (Sandbox Code Playgroud)

Column在函数定义中使用:

scala> def myFunc(c: Column) = ()
myFunc: (c: org.apache.spark.sql.Column)Unit
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.但是在定义类时,Column找不到:

scala> case class myClass(c: Column)
<console>:11: error: not found: type Column
       case class myClass(c: Column)
Run Code Online (Sandbox Code Playgroud)

然而,单线程工作:

scala> case class myClass(c: org.apache.spark.sql.Column)
defined class myClass
Run Code Online (Sandbox Code Playgroud)

要么

scala> import org.apache.spark.sql.Column; case class myClass(c: Column)
import org.apache.spark.sql.Column
defined class myClass
Run Code Online (Sandbox Code Playgroud)

Yeh*_*kon 5

这是Spark问题.
它适用于Spark 1.6,但问题仍然存在于Spark 2.1.0或更高版本中.

根本原因:

Shell中定义的类是内部类,因此无法通过反射轻松实例化.他们需要额外引用外部对象,这是非常重要的.

作为一种解决方法尝试:paste在spark-shell中使用.