Получите все возможные комбинации ключей JavaPairRDD эффективным способом - PullRequest
0 голосов
/ 19 декабря 2018

Используя Spark, один из промежуточных шагов моего алгоритма выведет (Key, Vector) в PairRDD.После завершения этого шага я хотел бы сгенерировать все возможные 2-комбинации клавиш и выполнить дальнейшие операции над их значениями, т. Е. Хотел бы иметь PairRDD с ((Key1, Key2), (Vector1, Vector2)).

Однако я не уверен, как сделать это эффективно с помощью Spark. Единственный способ, который я могу себе представить, - это собрать все пары ключ-значение на одной машине и выполнить там комбинации, которыеочевидно, не масштабируется.

Я думаю, что смогу воспользоваться еще одним свойством моего набора данных, хотя: мне нужно учитывать только комбинацию (Key1, Key2), если скалярное произведениеиз двух векторов значений (Vector <> 1, Vector <> 2) не равен нулю.(На практике мои векторы - это HashMap, а произведение с нулевой точкой означало бы пустое пересечение набора ключей)

Есть идеи о том, как я могу добиться этого масштабируемым образом?Я не могу понять это.Спасибо !!

1 Ответ

0 голосов
/ 19 декабря 2018

Как я понимаю, вы хотите сделать декартово умножение spark rdd, к счастью для вас, он уже предоставляет эту функцию. Он будет делать это не собирая все данные на одной машине, а запуская их на каждом из исполнителей.

yourPairRdd.cartesian(yourPairRdd);

Если вы хотите отфильтровать результаты, где сумма равна 0, просто используйте функцию фильтра

yourPairRdd.cartesian(yourPairRdd).filter(filterFunc);
...