Spark: какова лучшая стратегия объединения RDD с двумя ключами и RDD с одним ключом?

У меня есть два RDD 'Я хочу присоединиться, и они выглядят так:

val rdd1:RDD[(T,U)]
val rdd2:RDD[((T,W), V)]

Случается, что ключевые значенияrdd1 являются уникальными, а также что значения ключа кортежа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

Кто-нибудь сталкивался с такой ситуацией раньше? Я'Буду счастлив иметь ваши мысли.

Спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос