присоединиться к двум rdds, чтобы составить список смежности

Я новичок в искрах, у меня есть два rdd, к которым я хочу присоединиться, чтобы составить список смежности.

RDD1 (nodes): (a, b, c, d, e, f, g)

RDD2 (Edges): ((a,b), (a,e), (f, a), (k,l) ...)

теперь я хочу присоединиться к этим двум rdd, чтобы создать список смежности, подобный этому

( (a,(b,e,..)), (b,(f,....), (g()) ,...)
#assuming that g is not connected to any node , also filter (k,l) because k and l are not in the nodes rdd

а также позже мне нужно найти общее количество узлов и ребер.


person Azeem Akhter    schedule 15.04.2016    source источник
comment
Не могли бы пояснить: нужно найти общее количество узлов и ребер? Означает ли это, что список смежности является лишь временной структурой?   -  person zero323    schedule 15.04.2016
comment
Это означает, что мне нужен как счетчик, так и список смежности.   -  person Azeem Akhter    schedule 15.04.2016
comment
Хорошо, вы пробовали что-нибудь? Хотя в PySpark нет эффективного решения, это всего лишь один вызов встроенного метода.   -  person zero323    schedule 15.04.2016
comment
Да, я добился некоторого прогресса. Теперь у меня есть один rdd с (a ,(a,e),(a,b)..) теперь я хочу изменить это на (a,(e,b,...)   -  person Azeem Akhter    schedule 15.04.2016


Ответы (1)


Итак, если я правильно понимаю, вы хотите иметь список смежности, в котором окончательный RDD состоит из пар ключ-значение, где ключ является узлом, а значение - списком его ребер. Возможно, вы имели в виду то, что показано ниже? Хотя я считаю, что если вы хотите, чтобы «g» отображалось в вашем окончательном RDD, было бы разумно иметь его в вашем списке ребер как ( «g», «»), поскольку вы хотите передать, что у него нет ребер.

Чтобы присоединиться, нам нужно преобразовать список узлов в пару RDD, поэтому сначала мы распараллеливаем, чтобы создать RDD, а затем сопоставляем фиктивное значение, чтобы у нас были пары ключ-значение.

Теперь мы можем соединить два СДР друг с другом, и результатом будут только те ключи, которые существуют в обоих СДР, в данном случае «a» и «f». Наконец, мы удаляем фиктивное значение, которое мы добавили к узлам RDD и groupByKey, чтобы сгруппировать наши значения вместе.

nodes = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
edges = [('a','b'), ('a','e'), ('f', 'a'), ('k','l')]
nodesRDD = sc.parallelize(nodes).map(lambda n: (n, ''))
edgesRDD = sc.parallelize(edges)
joinedRDD = nodesRDD.join(edgesRDD).map(lambda tup: (tup[0], tup[1][1]))
groupedRDD = joinedRDD.groupByKey()

groupedRDD.map(lambda x : (x[0], list(x[1]))).collect()

Out[146]: [('f', ['a']), ('a', ['b', 'e'])]

Счет аналогичен, но теперь нас не интересуют фактические значения узлов, а только их количество:

nodes = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
edges = [('a','b'), ('a','e'), ('f', 'a'), ('k','l')]
nodesRDD = sc.parallelize(nodes).map(lambda n: (n, 0))
edgesRDD = sc.parallelize(edges).map(lambda tup: (tup[0], 1))
joinedRDD = nodesRDD.join(edgesRDD).map(lambda tup: (tup[0], tup[1][1]))
reducedRDD = joinedRDD.reduceByKey(lambda a, b: a + b)

reducedRDD.collect()

Выход[159]: [('f', 1), ('a', 2)]

person esap120    schedule 15.04.2016
comment
Не используйте reduceByKey для объединения списков. Это никогда не лучше, чем groupByKey, а на JVM значительно хуже. - person zero323; 15.04.2016
comment
Забавно, что у меня были символы только в качестве примера, в реальной задаче это строки, теперь я получаю что-то вроде этого ((string1,[s,t,r,i,n,g,2,...] )....) - person Azeem Akhter; 15.04.2016
comment
@zero323 ноль323 хороший момент, я отредактировал преобразования для groupByKey, чтобы предотвратить ненужную сборку мусора. - person esap120; 15.04.2016
comment
@AzeemAkhter Интересно, я только что провел тест со всеми значениями в виде строк, и я все еще получаю правильный результат, возможно, попробуйте версию, которую я только что отредактировал, которая теперь использует groupByKey? - person esap120; 15.04.2016
comment
Да, теперь это работает нормально, однако в окончательном списке смежности вместо только узлов, к которым подключен один ключ, у меня есть кортежи с '' и другим узлом. как я могу сделать так, чтобы он содержал только имя узла? Я подозреваю, что здесь карта, но как сопоставить несколько значений одного ключа - person Azeem Akhter; 16.04.2016