2016-05-24 25 views
0

我剛開始學習scala和spark。這裏有一個關於scala功能和類的問題:在spark中使用函數或類的scala:org.apache.spark.SparkException:任務不可序列化

我的環境是scala,spark,linux,vm virtualbox。在終結者,我定義一個類:

scala> class MyClass extends Serializable { 
    | val field = "Hello" 
    | def doStuff(rdd: RDD[String]): RDD[String] = { rdd.map(x => field + x) } 
    | } 
var a=new MyClass 
aaa=sc.textFile("data.txt") 

其中data.txt中是非常簡單的:

當我嘗試a.doStuff(AAA),我得到了以下錯誤信息:

org.apache.spark.SparkException: Task not serializable 
    at  org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:304) 
    at org.apache.spark.util.ClosureCleaner$.org$apache$spark$util$ClosureCleaner$$clean(ClosureCleaner.scala:294) 
at org.apache.spark.util.ClosureCleaner$.clean(ClosureCleaner.scala:122) 
at org.apache.spark.SparkContext.clean(SparkContext.scala:2055) 
.... 

我嘗試了一些我在網上找到的方法。只是不能得到它的工作。 任何人都可以提供幫助嗎?許多人認爲。 因爲我是初學者,請給我儘可能多的細節,如果這是一個很大的麻煩。否則,我可能仍然感到困惑。非常感謝。

+0

發表您的全火花圖。 –

+0

非常感謝我以某種方式想出來。 –

回答

0

我認爲這是確定:

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

scala> class MyClass extends Serializable { 
    | val field = "Hello" 
    | def doStuff(rdd: RDD[String]): RDD[String] = { rdd.map(x => field + x) } 
    | } 
defined class MyClass 

scala> val a=new MyClass 
a: MyClass = [email protected] 

scala> val aaa = sc.textFile("/home/fengchen/mine/sparkexamples/data.txt") 
aaa: org.apache.spark.rdd.RDD[String] = /home/fengchen/mine/sparkexamples/data.txt MapPartitionsRDD[12] at textFile at <console>:30 

scala> a.doStuff(aaa).collect 
res12: Array[String] = Array(Hello1 2 3 4, Helloa b c d) 
相關問題