型指定されたデータセットをフィルタリングするさまざまな方法を試してきました。パフォーマンスがまったく異なる可能性があることがわかります。
このデータ セットは、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 つのオプションとは異なる方法で実行される方法について、誰かが光を当てることができますか?