2017-05-01 8 views
0

私はSparkに2つのデータフレームを持っています。どちらもユニークなIDを持っています。 構造は、私は、次のデータフレームの結果を取得したい、次のフィールドへの参加時にデータフレーム間の結合を効率的に行う方法

df1: 
id_df1 values 
abc  abc_map_value 
cde  cde_map_value 
fgh  fgh_map_value 


df2: 
id_df2 array_id_df1 
123  [abc, fgh] 
456  [cde] 

です:私はこれを行うにスパークSQLを使用することができますが、私はそれはのように、最も効率的な方法だとは思わない

result_df: 
id_df2  array_values 
123  [map(abc,abc_map_value), map(fgh,fgh_map_value)] 
456  [map(cde,cde_map_value)] 

をIDはユニークです。

キー/値ディクショナリをメモリに保存して、キーを基にした値をルックアップする方法はありますか?結合よりも効率的でしょうか?

+0

/並列化(http://stackoverflow.com/questions/40673773/how-to-use-a-ため&削減を試すことができあなたのデータセットがあまりにも大きくない場合、ルックアップテーブルとしてのブロードキャストコレクション(40676271#40676271) – mtoto

答えて

0

df2をキー、値ペアに分解すると、結合は簡単になり、単なるgroupByが必要になります。

あなたは他の集計により効率あなたは[ブロードキャスト変数]を使用することができます

df2 
    .select('id_df2, explode('array_id_df1).alias("id_df1")) 
    .join(df1, usingColumn="id_df1") 
    .groupBy('id_df2) 
    .agg(collect_list(struct('id_df1, 'values)).alias("array_values")) 
関連する問題