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
Кто-нибудь сталкивался с такой ситуацией раньше? Я'Буду счастлив иметь ваши мысли.
Спасибо!