2016-09-21 10 views
0

私は2つのテーブルを持っています.1つはすべてのuser_idとその属性を持ち、もう1つは興味深いuser_idsとその属性だけです。私はそれらを両方とも照会して、機械学習問題のためのトレーニングセットを作成したいと思う。純粋なSQLでSparkに効率的に参加を残すには?

私はこのようにそれを行うだろう:スパークで

select label, user_id, feature 
from (
    select 1 as label, user_id, feature 
    from interesting_table 

    UNION ALL 

    select 0 as label, a.user_id, a.feature 
    from alldata_table a 
    left join 
    interesting table b 
    on a.user_id = b.user_id 
    where b.user_id is null 
) 

interesting_tableから引っ張っすることは十分に簡単ですが、左はinteresting_tablealldata_table間の結合は、高価な証明しています。

  • 上記の操作をsqlで正確に行い、その結果をデータフレームとして抽出しますか?
  • interesting_tablealldata_tableをデータフレームとして作成し、.join()演算子を使用しますか?
  • 「)(.isin」をデータフレームとしてinteresting_tablealldata_tableを作成し、否定することでinteresting_df.user_idサブセットalldata_df.user_idのユニークなメンバーを取得?
  • 他に何かありますか?
+0

待ち、 'a.user_id = b.user_id'と'どこb.user_idがヌル 'なので、'どこにa.user_idがヌルであるのか 'しかないかもしれません。 –

+0

これは左結合のため、b.user_idがnullで、a.user_idがそうでない場合は、a.user_idを保持し、不一致を示します。 –

+0

申し訳ありませんが、私のせいです;)それは大丈夫です。私はもっ​​と高価な答えを書くつもりですが、まずDSLまたはSQLを使用するかどうかは関係ありません。どちらもCatalystオプティマイザを使用して最適化されています –

答えて

0

これは最高の答えですが、データフレームAPIをブロードキャストで使用してしまいました。

alldata_table = spark.table('alldata_table') 
interesting_table = spark.table('interesting_table') 
interesting_table.withColumnRenamed('user_id','user_id_interesting') 

new_table = alldata_table.join(broadcast(interesting_table), 
    cond=[alldata_table['user_id']==interesting_table['user_id_interesting']], 
    how='left_outer') 
new_table.filter(new_table['user_id_interesting'].isnull()) 

もちろん、interesting_tableはブロードキャストに十分小さいと仮定しています。おそらく、それを小さくするためには、user_idフィールドだけに縮小することができます。

関連する問題