2016-11-21 4 views
3

id、name、比較的小さなデータフレーム(〜20kエントリ)の2つのカラムを含む比較的大きなデータフレーム(〜3.2テラバイト)それは、単一の列が含まれています。私は何をしようとしているID小さなデータフレームに存在する大きなデータフレームのエントリを効率的にフィルタリングする

は、私は、効率的な解決策になるかと思った彼らは、小さなデータフレーム

に表示された場合、大きなデータフレームからのIDと名前の両方を取ることですこれを稼働させるにはなぜですか?私が念頭に置いていたいくつかのオプション:

  1. 放送は2つのデータフレーム
  2. 放送に小さなデータフレームを結合し、文字列の配列としてそれを収集し、その後、大きなデータフレームにフィルタを適用し、文字列
  3. の配列とISINを使用します

私がここで言及しなかった他のオプションはありますか?

具体的な解決策は、そのすべて私の知る限り、事前

+0

PLSはhttp://stackoverflow.com/questions/40320441/difference-between-sc-broadcast-and-broadcast-function-in-を参照してください私のコメントにはリンクを私の答えを参照してくださいspark-sql –

+0

@RamPrasadGので、私は正しく理解することができます:オプション1を選択すると、小さなテーブルをブロードキャストし、大きなデータフレームと小さなものの間でハッシュジョインを実行します。オプション2では、ループ結合を使用してそれを実行しますか? thatsが正しい場合、オプション1のように聞こえますが、検索が高速になるので、正しいですか? – Gideon

答えて

2

に他の

おかげでより効率的である理由誰かがまた説明できる場合、私はそれを感謝しますが、あなたが扱っているデータのサイズと性能に依存します

  • あなたがbroadcast機能を使用する場合、デフォルトのサイズは10メガバイト(spark.sql.autobroadcastjointhreshholdを経由して、あなたの小さなデータフレームのためには、my answerを参照)で、あなたのデータに基づいてサイズを増減することができます。また、キャストされたデータはSQL実行計画の一部になり、さらに最適化を行うための触媒オプティマイザへのポインタになります。私の答えを参照してくださいhere

  • ブロードキャスト共有変数(あなたが使用したいisin)は、上記の利点を持っていません。

のplsは

+1

オプション1は、データセットが適合しない場合に柔軟性があります。 'SparkStrategies.scala'(フレームワーク側)の' canBroardcast'メソッドは、より良いパフォーマンスのために異なる戦略を適用します。 –

関連する問題