2017-02-04 14 views
0

У меня есть 2 RDD. Предположим, что rdd1 = {'a', 'b', 'c', 'a', 'c', 'a'}, а rdd2 - вывод KMeans с назначением кластера следующим образом:> rdd2 = {0,0,1 , 1,1,0}. Я хочу, в конце концов, узнать, сколько а и b есть в кластере 0 и 1. Например, 0 имеет 2 a, что-то вроде {0, a, 2} и т. Д. Есть ли способ объединить эти 2 RDDS для выполнения такого операция?Сочетание 2 RDD в питоне Spark

Благодарим за помощь.

+0

Так уточнить, вы бы искали {0/а/2}, {1/а/1}, {0/б/1} , {1/c/2}, правильно ли я понимаю? –

+0

Да, это правильно. –

ответ

0

Нижеследующие работы. используя tuples и list вместо set, где это необходимо.

rdd1 = sc.parallelize(['a','b','c', 'a', 'c', 'a']) 
rdd2 = sc.parallelize([0, 0, 1, 1, 1, 0]) 
rdd = rdd1.zip(rdd2).map(lambda x: (x,1)).reduceByKey(lambda x,y: x+y).map(lambda ((x1,x2),y): (x1,x2,y)) 
rdd.collect() 

Выход:

[('a', 0, 2), ('b', 0, 1), ('c', 1, 2), ('a', 1, 1)] 
+1

Если бы это был особенно большой набор данных, вам было бы лучше использовать 'reduceByKey', а не' groupBy', за которым следует 'map'. –

+0

@JoeC благодарит за ваше предложение. Я обновил ответ –

+0

Спасибо большое @ rogue-one. Это работает отлично! –