2017-09-12 4 views
0

this質問に続いて質問したいと思います。 - MajorRangeHive/Sparkでbigdataテーブルの関連するすべてのサブ範囲を効率的に見つける

row | From | To  | Group .... 
-----|--------|---------|--------- 
1 | 1200 | 1500 | A 
2 | 2200 | 2700 | B 
3 | 1700 | 1900 | C 
4 | 2100 | 2150 | D 
... 

第二のテーブル - SubRange

row | From | To  | Group .... 
-----|--------|---------|--------- 
1 | 1208 | 1300 | E 
2 | 1400 | 1600 | F 
3 | 1700 | 2100 | G 
4 | 2100 | 2500 | H 
... 

出力テーブルがMajorRange基上に重なっている全てSubRange基であるべきである 最初の表: 私は2つのテーブルを持っています。以下の例では、結果表である:

row | Major | Sub | 
-----|--------|------|- 
1 | A  | E | 
2 | A  | F | 
3 | B  | H | 
4 | C  | G | 
5 | D  | H | 

Majorが現れない範囲の間には重複が存在しない場合。 両方のテーブルが大きなデータテーブルです。最も効率的な方法でHive/Sparkを使用してどのように行うことができますか?

答えて

1

sparkとすると、このような非等結合になる可能性がありますか?

val join_expr = major_range("From") < sub_range("To") && major_range("To") > sub_range("From") 

(major_range.join(sub_range, join_expr) 
.select(
    monotonically_increasing_id().as("row"), 
    major_range("Group").as("Major"), 
    sub_range("Group").as("Sub") 
) 
).show 

+---+-----+---+ 
|row|Major|Sub| 
+---+-----+---+ 
| 0| A| E| 
| 1| A| F| 
| 2| B| H| 
| 3| C| G| 
| 4| D| H| 
+---+-----+---+ 
+0

ありがとう、行の列がない場合。あなたのコードで何を変更しなければなりませんか? – Avi

+1

コードを変更する必要はありません。 'row'カラムはここでは使用されません。私はあなたの出力を満たすために新しい '行'カラムを作成しました。 – Psidom

関連する問題