출처
왜 spark-shell은 RDD를 import한 class를 가진 파일을 불러오기를 실패할까요?
저는 Scala 2.11.8로 Spark 2.1.1을 사용합니다.
spark-shell에서 저는 RDD를 메소드로 가지는 클래스를 불러오기 위해 :load명령을 사용합니다.
그 클래스를 불러올 때 컴파일 오류가 나옵니다.
error: not found: type RDD
왜일까요? import 구문이 있습니다.
다음은 제가 작업한 코드입니다.
답변
spark-shell에서 :load의 특징인듯 합니다. 해결책은 당신의 클래스 정의하는 부분으로 import org.apache.spark.rdd.RDD(.이나 _ 없이)를 이동하는 것입니다.
이는 RDD클래스에만 국한 된 것이 아니고 모든 클래스에 해당합니다. import문이 클래스 자체 내에 정의되어 있지 않으면 작동하지 않습니다.
말했듯이, 다음은 클래스 밖에 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에 붙여 넣을 수 있습니다. 고유한 패키지에 클래스를 정의할 수 있는 raw 모드가 있습니다.
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.
// 붙여넣기 모드를 종료하고 인터프리터 모드입니다.
'Spark' 카테고리의 다른 글
스칼라에서 =와 :=의 차이점은 무엇입니까? (0) | 2019.03.29 |
---|---|
스칼라에서 파라미터:_* 는 무엇을 뜻합니까? (0) | 2019.01.28 |
Apache Spark: Row의 element값을 이름으로 얻기 (0) | 2018.11.12 |
같은 Sink로 여러개의 Spark Structured Streaming WriteStreams하기 (0) | 2018.11.05 |
스파크에서 fold action이 왜 필요합니까? (0) | 2018.04.08 |