Заранее прошу прощения за долгое чтение.Мы ценим ваше терпение.
У меня есть два числа A
и B
, а класс reducer
.
A
содержит два столбца (key
, a_value
).Клавиша A - ключ в столбце key
не встречается более одного раза.
B
имеет два столбца (key
, b_value
) - но без ключа, поле ключа может повторяться несколько раз.И некоторые клавиши могут быть сильно искажены - давайте назовем их горячие клавиши .
Редуктор построен с использованием 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()
Я хочу использовать таблицыA
и B
для создания таблиц C
, содержащих два столбца (key
, c_value
).
Это можно сделать тривиально, вызвав
reduceByKey
на B для создания rdd с двумя столбцами key, list[b_values]
- соединение с A на ключе
- Выполните блок кода выше, чтобы создать таблицу со столбцами
key, c_value
Проблема при таком подходе заключается в том, что горячие клавиши в B
вызывают reduceByKey
для OOM даже при очень высокой памяти исполнителя.
В идеале я хотел бы присоединиться и сразу же reducer.consume
b_value
с B
в A
- редуктор построен из a_value
с.,Еще один способ думать об этом - использовать aggregateByKey
, но с другими zeroValues
, полученными из другого rdd.
Как мне это выразить?(Я посмотрел на cogroup и aggregateByKey без какой-либо удачи)
Спасибо за чтение!