Пересечение двух RDD HashMap (HashMap‹Integer, HashSet‹Integer››) в Scala для Spark

Я работаю в Scala для программирования в Spark на автономном компьютере (ПК с Windows 10). Я новичок и у меня нет опыта программирования на scala и spark. Так что буду очень благодарен за помощь.

Проблема:

У меня есть HashMap, hMap1, значения которого представляют собой HashSets целочисленных записей (HashMap>). Затем я сохраняю его значения (т. е. многие значения HashSet) в RDD. Код приведен ниже

val rdd1 = sc.parallelize(Seq(hMap1.values()))

Теперь у меня есть другой HashMap, hMap2, того же типа, то есть HashMap>. Его значения также хранятся в RDD как

val rdd2 = sc.parallelize(Seq(hMap2.values()))

Я хочу знать, как мне пересечь значения hMap1 и hMap2

Например:

Ввод:

данные в rdd1 = [2, 3], [1, 109], [88, 17]

и данные в rdd2 = [2, 3], [1, 109], [5,45]

Вывод

поэтому вывод = [2, 3], [1, 109]


person Kifayat    schedule 12.11.2017    source источник


Ответы (1)


Постановка задачи

Мое понимание вашего вопроса следующее:

Учитывая два RDD типа RDD[Set[Integer]], как я могу создать RDD их общих записей.

Пример данных

Два RDD, созданные

val rdd1 = sc.parallelize(Seq(Set(2, 3), Set(1, 109), Set(88, 17)))
val rdd2 = sc.parallelize(Seq(Set(2, 3), Set(1, 109), Set(5, 45)))

Возможное решение

Если я правильно понимаю постановку задачи, вы можете использовать rdd1.intersection(rdd2) если ваши СДР таковы, как я думал. Вот что я пробовал на искровой оболочке со Spark 2.2.0:

rdd1.intersection(rdd2).collect

что дало результат:

Array(Set(2, 3), Set(1, 109))

Это работает, потому что Spark может сравнивать элементы типа Set[Integer], но обратите внимание, что это нельзя обобщить для любого объекта Set[MyObject], если вы не определили соглашение о равенстве MyObject.

person Alexandre Dupriez    schedule 12.11.2017
comment
Спасибо, Алекс, за своевременный ответ, это очень помогло. На самом деле у меня есть 2 класса: один на Scala, а другой на Java. А исходные данные находятся в HashMap класса Java, где ключ — целое число, а соответствующее ему значение — HashSet целых чисел. Поэтому, когда я извлекаю значения в Scala, я получаю сообщение об ошибке. И основная ошибка заключалась в том, что значения HashMap не являются «сериализуемыми», поэтому я не мог получить нужные данные. В качестве решения: я сохранил значения HashMap класса Java в общедоступной статической переменной, а затем напрямую вызвал эту переменную в классе Scala. - person Kifayat; 14.11.2017
comment
Спасибо за обновление - я не уверен, что понимаю, почему Java Hashset из Integer не может быть жестко сериализован? Не стесняйтесь поделиться исключением, если у вас есть время - мне просто любопытно - person Alexandre Dupriez; 14.11.2017
comment
Привет Алекс, я был очень занят, поэтому не мог ответить вовремя. Я постараюсь отправить вам ошибку до следующей недели. В любом случае, у меня есть еще один вопрос, если бы вы могли мне ответить, это тоже было бы большим подспорьем. Мой вопрос: stackoverflow.com/questions/47324904/ - person Kifayat; 16.11.2017