【问题标题】:Why does spark-shell fail to load a file with class with RDD imported?为什么 spark-shell 无法加载导入了 RED 的类的文件?
【发布时间】:2017-06-09 06:36:38
【问题描述】:

我使用 Spark 2.1.1 和 Scala 2.11.8。

spark-shell 内部,我使用:load 命令加载一个类,该类具有带有RDD 的方法。

当我尝试加载类时,出现以下编译错误:

错误:未找到:类型 RDD

为什么?我有导入声明。

这是我正在使用的代码

【问题讨论】:

  • 嗨!欢迎来到stackoverflow。请阅读MCVE。另外,尝试将您的代码/错误发布为 sn-p 而不是图像。
  • 检查并确保提供 spark 依赖项,主要是在您的 CLASSPATH 中添加的 spark_core 依赖项。
  • 在 spark-shell 中工作时类路径是否起作用?
  • 是的,但不适用于这个问题,因为这些类属于 Spark。

标签: scala apache-spark


【解决方案1】:

这似乎是:loadspark-shell 中的一个功能。一种解决方案是将import org.apache.spark.rdd.RDD(无点和下划线)移动到您的类定义中。

这似乎不是特定于 RDD 类,而是任何导入的类。除非在类本身中定义了 import 语句,否则它将不起作用。

话虽如此,由于导入在类之外,因此以下内容将不起作用。

import org.apache.spark.rdd.RDD
class Hello {
  def get(rdd: RDD[String]): RDD[String] = rdd
}

scala> :load hello.scala
Loading hello.scala...
import org.apache.spark.rdd.RDD
<console>:12: error: not found: type RDD
         def get(rdd: RDD[String]): RDD[String] = rdd
                                    ^
<console>:12: error: not found: type RDD
         def get(rdd: RDD[String]): RDD[String] = rdd
                      ^

您可以使用:load-v 标志查看幕后发生的事情。

scala> :load -v hello.scala
Loading hello.scala...

scala>

scala> import org.apache.spark.rdd.RDD
import org.apache.spark.rdd.RDD

scala> class Hello {
     |   def get(rdd: RDD[String]): RDD[String] = rdd
     | }
<console>:12: error: not found: type RDD
         def get(rdd: RDD[String]): RDD[String] = rdd
                                    ^
<console>:12: error: not found: type RDD
         def get(rdd: RDD[String]): RDD[String] = rdd
                      ^

这让我猜测在类定义中引入 import 会有所帮助。它做到了! (让我大吃一惊)

class Hello {
  import org.apache.spark.rdd.RDD
  def get(rdd: RDD[String]): RDD[String] = rdd
}

scala> :load -v hello.scala
Loading hello.scala...

scala> class Hello {
     |   import org.apache.spark.rdd.RDD
     |   def get(rdd: RDD[String]): RDD[String] = rdd
     | }
defined class Hello

您也可以使用:paste 命令将类粘贴到spark-shell。当您可以在自己的包中定义类时,就有所谓的原始模式。

package mypackage

class Hello {
  import org.apache.spark.rdd.RDD
  def get(rdd: RDD[String]): RDD[String] = rdd
}

scala> :load -v hello.scala
Loading hello.scala...

scala> package mypackage
<console>:1: error: illegal start of definition
package mypackage
^

scala>

scala> class Hello {
     |   import org.apache.spark.rdd.RDD
     |   def get(rdd: RDD[String]): RDD[String] = rdd
     | }
defined class Hello

scala> :paste -raw
// Entering paste mode (ctrl-D to finish)

package mypackage

class Hello {
  import org.apache.spark.rdd.RDD
  def get(rdd: RDD[String]): RDD[String] = rdd
}

// Exiting paste mode, now interpreting.

【讨论】:

  • 另外请注意,这不仅仅针对 RDD 类,而且对于任何要导入的类,除非在类本身内部定义了导入包,否则它将不起作用。但是可以为一个类中的多个定义导入多个类吗??
  • 不知道。刚从你那里学的!谢谢。至于多个类,认为这是可以接受的,但需要测试,因为:load 似乎在语法上添加了额外的规则(正如我们刚刚学到的那样)。
【解决方案2】:

这是 spark-shell 中的一个 bug,请参考https://issues.apache.org/jira/browse/SPARK-22393,并在 spark 2.3.0 中修复。请使用 spark 2.3.0(或更高版本)或使用@Jacek Laskowski 建议的方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    相关资源
    最近更新 更多