2017-09-12 2 views
0

Nach this Frage, möchte ich fragen. Ich habe 2 Tabellen: Die erste Tabelle - MajorRangeEffizient alle relevanten Unterbereiche für bigdata Tabellen in Hive/Spark

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

Die zweite Tabelle - SubRange

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

Die Ausgabetabelle die alle SubRange Gruppen sein sollten, die die MajorRange Gruppen überlappen über hat. Im folgenden Beispiel ist die Ergebnistabelle:

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

Falls es keine Überschneidungen zwischen den Bereichen der Major wird nicht angezeigt. Beide Tabellen sind große Datentabellen.Wie kann ich es am effizientesten mit Hive/Spark machen?

Antwort

1

Mit spark, vielleicht ein non equi beizutreten wie folgt?

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

Danke, falls keine Zeilenspalte vorhanden ist. Was muss ich in Ihrem Code ändern? – Avi

+1

Sie müssen den Code nicht ändern. Die Spalte "row" wird hier nicht verwendet. Ich habe eine neue Zeilenspalte erstellt, um Ihre Ausgabe zu erfüllen. – Psidom

Verwandte Themen