web-dev-qa-db-ja.com

Sparkデータフレームを使用したユニットテスト

データフレームで変換を実行するプログラムの一部をテストしようとしています。ファイルから特定のDF)を読み取るオプションを除外する、これらのデータフレームのいくつかの異なるバリエーションをテストしたいと思います。

そして、私の質問は次のとおりです。

  1. Sparkとデータフレームを使用してユニットテストを実行する方法、特にデータフレームの作成に関して、良いチュートリアルはありますか?
  2. 多くの定型文を使用せずに、またファイルからこれらを読み取らずに、これらの異なる数行のデータフレームを作成するにはどうすればよいですか?
  3. データフレーム内の特定の値をチェックするためのユーティリティクラスはありますか?

私は明らかに以前にそれをググったが、非常に有用なものを見つけることができなかった。私が見つけたより有用なリンクの中には:

例/チュートリアルがScalaにあるといいのですが、私はあなたが持っているどんな言語でも取ります

前もって感謝します

7
Gideon

この link は、スキーマを使用してプログラムでデータフレームを作成する方法を示しています。データを別々の特性に保持し、テストと組み合わせることができます。例えば、

// This example assumes CSV data. But same approach should work for other formats as well.

trait TestData {
  val data1 = List(
    "this,is,valid,data",
    "this,is,in-valid,data",
  )
  val data2 = ...  
}

次に、ScalaTestを使用すると、次のようなことができます。

class MyDFTest extends FlatSpec with Matchers {

  "method" should "perform this" in new TestData {
     // You can access your test data here. Use it to create the DataFrame.
     // Your test here.
  }
}

DataFrameを作成するには、以下のようないくつかのutilメソッドを使用できます。

  def schema(types: Array[String], cols: Array[String]) = {
    val datatypes = types.map {
      case "String" => StringType
      case "Long" => LongType
      case "Double" => DoubleType
      // Add more types here based on your data.
      case _ => StringType
    }
    StructType(cols.indices.map(x => StructField(cols(x), datatypes(x))).toArray)
  }

  def df(data: List[String], types: Array[String], cols: Array[String]) = {
    val rdd = sc.parallelize(data)
    val parser = new CSVParser(',')
    val split = rdd.map(line => parser.parseLine(line))
    val rdd = split.map(arr => Row(arr(0), arr(1), arr(2), arr(3)))
    sqlContext.createDataFrame(rdd, schema(types, cols))
  }

DataFrameの特定の値をチェックするためのユーティリティクラスを知りません。しかし、DataFrameAPIを使用して作成するのは簡単なはずだと思います。

8
Jegan

SharedSQLContext および SharedSparkSession that Sparkは独自の単体テストに使用します。 answer 例として。

0
Eugene Lopatkin

Javaで同様のことを実現したい場合は、startを使用して、このプロジェクトを使用して単体テスト内でSparkContextを初期化できます。 https://github.com/holdenk/spark-testing-base

私は個人的にいくつかのAVROファイルのファイル構造を模倣しなければなりませんでした。そこで、Avro-tools( https://avro.Apache.org/docs/1.8.2/gettingstartedjava.html#download_install )を使用して、次のコマンドを使用してバイナリレコードからスキーマを抽出しました。

Java -jar $AVRO_HOME/avro tojson largeAvroFile.avro | head -3

次に、この小さなヘルパーメソッドを使用して、出力JSONをDataFrameに変換し、単体テストで使用できます。

private DataFrame getDataFrameFromList() {
    SQLContext sqlContext = new SQLContext(jsc());
    ImmutableList<String> elements = ImmutableList.of(
        {"header":{"appId":"myAppId1","clientIp":"10.22.63.3","createdDate":"2017-05-10T02:09:59.984Z"}}
        {"header":{"appId":"myAppId1","clientIp":"11.22.63.3","createdDate":"2017-05-11T02:09:59.984Z"}}
        {"header":{"appId":"myAppId1","clientIp":"12.22.63.3","createdDate":"2017-05-11T02:09:59.984Z"}}
    );
    JavaRDD<String> parallelize = jsc().parallelize(elements);
    return sqlContext.read().json(parallelize);
}
0
UltimaWeapon