我已经使用Spark的Java API实现了内部联接。在两个数据集中,一个应该具有大约1,000,000行的大量数据,而另一个可能有大约5000行。
DS1
+----+----+----+----+-------+
| C1 | C2 | C3 | C4 | C5 |
+----+----+----+----+-------+
| S1 | 1 | 2 | 6 | 3 |
| S2 | 1 | 3 | 7 | 2 |
| S3 | 1 | 4 | 8 | 11 |
| S4 | 1 | 5 | 9 | null |
+----+----+----+----+-------+
DS2
+----+-----+
| EK | EV |
+----+-----+
| C1 | S2 |
| C4 | 7 |
| C3 | 2 |
| C5 | 2 |
+----+-----+
Expected output
+----+----+----+----+-------+----+----+
| C1 | C2 | C3 | C4 | C5 | EK | EK |
+----+----+----+----+-------+----+----+
| S1 | 1 | 2 | 6 | 3 | C3 | 2 |
| S2 | 1 | 3 | 7 | 2 | C1 | S2 |
| S2 | 1 | 3 | 7 | 2 | C4 | 7 |
| S2 | 1 | 3 | 7 | 2 | C5 | 2 |
| S3 | 1 | 4 | 8 | 11 |null|null|
| S4 | 1 | 5 | 9 | null |null|null|
+----+----+----+----+-------+----+----+
我尝试过左联接,但这太慢了。然后,我们尝试了使用内部联接的替代实现,但是即使内部联接也非常慢。
左加入
Dataset<Row> joinedDS = inputJoinedWithHierarchies.join(broadcast(substitutionExclusionDS),
(column("EK").equalTo(lit("C1")).and(column("EV").equalTo(column("C1"))))
.or((column("EK").equalTo(lit("C2")).and(column("EV").equalTo(column("C2")))))
.or((column("EK").equalTo(lit("C3")).and(column("EV").equalTo(column("C3")))))
.or((column("EK").equalTo(lit("C4")).and(column("EV").equalTo(column("C4")))))
.or((column("EK").equalTo(lit("C5")).and(column("EV").equalTo(column("C5"))))),
"left_outer"
)
.drop(<some_columns>)
内部加入
Dataset<Row> joinedDS = inputJoinedWithHierarchies.join(broadcast(substitutionExclusionDS),
(column("EK").equalTo(lit("C1")).and(column("EV").equalTo(column("C1"))))
.or((column("EK").equalTo(lit("C2")).and(column("EV").equalTo(column("C2")))))
.or((column("EK").equalTo(lit("C3")).and(column("EV").equalTo(column("C3")))))
.or((column("EK").equalTo(lit("C4")).and(column("EV").equalTo(column("C4")))))
.or((column("EK").equalTo(lit("C5")).and(column("EV").equalTo(column("C5"))))),
"left_outer"
)
.drop(<some_columns>)
即使采用了多种替代方法来替换/增强left-outer
加入(包括广播加入),一切似乎都非常缓慢,并且无法确定原因/解释。
感谢您的帮助。谢谢!