2017-08-16 9 views
0

RDD上のforeachメソッドのアサート文のために「タスクがシリアライズできません」というエラーが発生しています。 RDDのすべての要素に対してアサーションを書くための回避策はありますか?SPARKアサート文のためにタスクがシリアライズできない

class myTest extends Funsuite { 

    //some code to create spark context(sc) 

    var arrRDD = sc.parallelize(Array(1,1,1,1,1)) 

    test("custom test"){ 
    arrRDD.foreach{ 
     x => { 
      //commenting out this assert removes the error 
      assert(x == 1) 
     } 
    } 
    } 

} 

答えて

0

RDD(弾力性のある分散型データセット)我々だけで抽象化によるものである単一のマシンでコレクションとして見、私たちが作業する場合、クラスタ内のノードに分配されるコレクションです。

あなたがRDD.mapまたはmapのような任意の他の変換、filterなどを実行すると、これはシリアル化され、クラスタ上の他のノードに移動され、これらのノード上で実行されます。

"Task not serializable"のエラーは、arrRDD.foreachがシリアル化されていますが、その内部のメソッド"assert"がシリアル化されていないため、他のノードに移動することはできません。

あなたはassertには

arrRDD.collect().foreach{ 
    x => assert (x == 1) 
} 

としてarrayassertとしてドライバノードにデータをもたらします。しかし、私は、それはまだ良いとは思わないことができます値だけcollectそれを、しようと気にした場合方法!

ホープこれはあなたを助け:)

0

をあなたはこの小さなユースケースをテストしたい場合は、あなたが実際のScalaのコレクションにそれを収集し、その上でアサートを使用することができます。シャンカールが言ったように。

ユニットテストの範囲を広げたい場合はunit testing frameworkを使用できます。

関連する問題