7

型指定されたデータセットをフィルタリングするさまざまな方法を試してきました。パフォーマンスがまったく異なる可能性があることがわかります。

このデータ セットは、33 列と 4226047 行の 1.6 GB 行のデータに基づいて作成されました。csv データを読み込んで DataSet を作成し、case クラスにマッピングします。

val df = spark.read.csv(csvFile).as[FireIncident]

UnitId = 'B02' のフィルターは、47980 行を返す必要があります。以下のように 3 つの方法をテストしました。

df.where($"UnitID" === "B02").count()

2)一時テーブルとSQLクエリを使用します(〜オプション1と同じ)

df.createOrReplaceTempView("FireIncidentsSF")
spark.sql("SELECT * FROM FireIncidentsSF WHERE UnitID='B02'").count()

3) 強い型付けされたクラス フィールドを使用する (14,987ms、つまり 30 倍遅い)

df.filter(_.UnitID.orNull == "B02").count()

Python API で再度テストしたところ、同じデータ セットに対して、タイミングは 17,046 ミリ秒で、scala API オプション 3 のパフォーマンスに匹敵します。

df.filter(df['UnitID'] == 'B02').count()

3) と python API が最初の 2 つのオプションとは異なる方法で実行される方法について、誰かが光を当てることができますか?

4

2 に答える 2

0

Python を実行すると、最初にコードが JVM にロードされ、解釈され、最後にバイトコードにコンパイルされます。Scala API を使用する場合、Scala は JVM でネイティブに実行されるため、ロード Python コード全体を JVM 部分に切り出すことになります。

于 2016-12-20T20:54:54.543 に答える