如何通过融合SHUFFLE和COMBINE来表达有效的JOIN?

时间:2018-09-28 01:36:16

标签: apache-spark

我很抱歉长时间阅读。感谢您的耐心等候。

我有两个rdds AB,还有一个reducer类。

A包含两列(keya_value)。 A是带键的-key列中没有键出现多次。

B有两列(keyb_value)-但没有输入关键字,因此关键字字段可以重复多次。还有一些键可能会严重偏斜-让我们称它们为热键

Reducer使用a_value构造,并且可以任何顺序使用b_values的对应密钥。最后,化简器可以产生代表还原的c_value

减速器的示例用法如下(伪代码)

reducer = construct_reducer(a_value)
for b_value in b_values:
    reducer.consume(b_value)
c_value = reducer.result()

我想使用表AB来生成包含两列(Ckey)的表c_value

这可以通过完成

轻松完成。
  1. 在B上调用reduceByKey以产生具有两列key, list[b_values]的rdd
  2. 在键上与A联接
  3. 执行上面的代码块以产生带有列key, c_value的表

采用该方法的问题是,B中的热键即使在执行者内存很高的情况下也会导致reduceByKey成为OOM。

理想情况下,我想加入并立即从reducer.consume {strong>进入 b_value B A-减速器是由a_value个构造而成。考虑这一点的另一种方法是使用aggregateByKey,但要从另一个rdd获得不同的zeroValues

我该如何表达? (我看着cogroup和aggregateByKey没有任何运气)

感谢阅读!

0 个答案:

没有答案