У меня есть два RDD, к которым я хочу присоединиться, и они выглядят так:
val rdd1:RDD[(T,U)]
val rdd2:RDD[((T,W), V)]
Случается, что ключевые значения rdd1
уникальны, а также то, что значения tuple-key rdd2
уникальны. Я хотел бы присоединиться к двум наборам данных, чтобы получить следующий rdd:
val rdd_joined:RDD[((T,W), (U,V))]
Какой самый эффективный способ достичь этого? Вот несколько идей, о которых я думал.
Вариант 1:
val m = rdd1.collectAsMap
val rdd_joined = rdd2.map({case ((t,w), u) => ((t,w), u, m.get(t))})
Вариант 2:
val distinct_w = rdd2.map({case ((t,w), u) => w}).distinct
val rdd_joined = rdd1.cartesian(distinct_w).join(rdd2)
Вариант 1 будет собирать все данные для мастеринга, правильно? Таким образом, это не похоже на хороший вариант, если rdd1 большой (он относительно большой в моем случае, хотя на порядок меньше rdd2). Вариант 2 делает уродливый отчетливый и декартова продукт, который также кажется очень неэффективным. Еще одна возможность, которая пришла мне в голову (но еще не пробовала), - это сделать вариант 1 и трансляцию карты, хотя лучше было бы транслировать "умным" способом, чтобы ключи карты были расположены вместе с ключи rdd2
.
Кто-нибудь раньше сталкивался с подобной ситуацией? Я был бы рад получить ваши мысли.
Спасибо!