web-dev-qa-db-ja.com

ユニットテストでa Spark RDDをモックする

SparkContextを使用せずにRDDをモックすることは可能ですか?

次の効用関数を単体テストしたい:

 def myUtilityFunction(data1: org.Apache.spark.rdd.RDD[myClass1], data2: org.Apache.spark.rdd.RDD[myClass2]): org.Apache.spark.rdd.RDD[myClass1] = {...}

したがって、data1とdata2をmyUtilityFunctionに渡す必要があります。 SparkContextから実際のRDDを作成する代わりに、モックorg.Apache.spark.rdd.RDD [myClass1]からdata1を作成するにはどうすればよいですか?ありがとうございました!

10
Edamame

私はそれについて@Holdenに完全に同意します!

RDDSをあざけるのは難しいです。 プログラミングガイド で推奨されているように、ローカルSparkコンテキストでユニットテストを実行することをお勧めします。

これは技術的には単体テストではないかもしれませんが、十分に近いことを願っています。

ユニットテスト

Sparkは、一般的な単体テストフレームワークを使用した単体テストに適しています。マスターURLをローカルに設定してテストでSparkContextを作成し、操作を実行してから、SparkContext.stop()を呼び出して破棄するだけです。 Sparkは、同じプログラムで同時に実行される2つのコンテキストをサポートしていないため、finallyブロックまたはテストフレームワークのtearDownメソッド内でコンテキストを停止するようにしてください。

しかし、本当に興味があり、それでもRDDのモックを試したい場合は、 ImplicitSuite テストコードを読むことをお勧めします。

彼らがRDDを疑似モックしている唯一の理由は、implictがコンパイラーでうまく機能するかどうかをテストすることですが、実際には実際のRDDは必要ありません。

def mockRDD[T]: org.Apache.spark.rdd.RDD[T] = null

そして、それは本当のモックでさえありません。タイプRDD [T]のnullオブジェクトを作成するだけです。

11
eliasah

RDDは非常に複雑であり、それらをモックすることは、テストデータを作成するための最良の方法ではない可能性があります。代わりに、データでsc.parallelizeを使用することをお勧めします。私も(やや偏見がありますが) https://github.com/holdenk/spark-testing-base セットアップと分解の特性を提供することで役立つと思いますSparkテストのコンテキスト。

19
Holden