在hive/spark中高效地查找bigdata表的所有相关子范围

ndh0cuux  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(318)

在这个问题之后,我想问一下。我有两张table:第一张table- MajorRange ```
row | From | To | Group ....
-----|--------|---------|---------
1 | 1200 | 1500 | A
2 | 2200 | 2700 | B
3 | 1700 | 1900 | C
4 | 2100 | 2150 | D
...

第二张table- `SubRange` ```
row  | From   |  To     | Group ....
-----|--------|---------|---------
1    | 1208   |   1300  | E
2    | 1400   |   1600  | F
3    | 1700   |   2100  | G
4    | 2100   |   2500  | H
...

输出表应该是所有 SubRange 有重叠的组 MajorRange 组。在以下示例中,结果表为:

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

如果范围之间没有重叠 Major 不会出现。这两个表都是大数据表。如何以最有效的方式使用hive/spark?

but5z9lq

but5z9lq1#

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|
+---+-----+---+

相关问题