Spark连接多个键非常慢

时间:2018-06-27 19:28:57

标签: apache-spark inner-join outer-join

我已经使用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加入(包括广播加入),一切似乎都非常缓慢,并且无法确定原因/解释。

感谢您的帮助。谢谢!

0 个答案:

没有答案