2015-07-14 10 views
5

Ich versuche, die reduceByKey Funktion von pyspark auf Daten des Formats (([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e], 1), ...Eine Liste als Schlüssel für PySpark des reduceByKey

Es scheint pyspark in normalen Schlüsseln ein Array als Schlüssel akzeptiert nicht zu nennen, Wertminderung von einfach Anwendung .reduceByKey (hinzufügen).

Ich habe bereits versucht zuerst das Array in eine Zeichenfolge zu konvertieren, durch .map((x,y): (str(x),y)), aber das funktioniert nicht, da Nachbearbeitung der Zeichenfolgen zurück in Arrays zu langsam ist.

Gibt es eine Möglichkeit, ich kann Pyspark verwenden Sie das Array als Schlüssel oder verwenden Sie eine andere Funktion, um die Zeichenfolgen zurück in Arrays schnell zu konvertieren?

hier ist der zugehörige Fehlercode

File "/home/jan/Documents/spark-1.4.0/python/lib/pyspark.zip/pyspark/shuffle.py", line 268, in mergeValues 
    d[k] = comb(d[k], v) if k in d else creator(v) 
TypeError: unhashable type: 'list' 
    enter code here 

ZUSAMMENFASSUNG:

input: x =[([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e], 1), ...]

gewünschten Ausgangs: y =[([a,b,c], 2), ([a,d,b,e], 1),...] so dass I a von y[0][0][0] und 2 von y[0][1]

zugreifen konnte

Antwort

8

Try this:

rdd.map(lambda (k, v): (tuple(k), v)).groupByKey() 

Da Python-Listen wandelbar sind, bedeutet dies, dass nicht gehasht werden kann (nicht bieten __hash__-Methode):

>>> a_list = [1, 2, 3] 
>>> a_list.__hash__ is None 
True 
>>> hash(a_list) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'list' 

Tupeln von der anderen Seite sind unveränderlich und bieten __hash__ Methodenimplementierung:

>>> a_tuple = (1, 2, 3) 
>>> a_tuple.__hash__ is None 
False 
>>> hash(a_tuple) 
2528502973977326415 

kann daher als Schlüssel verwendet werden. Ebenso, wenn Sie eindeutige Werte als Schlüssel verwenden möchten, sollten Sie frozenset verwenden:

rdd.map(lambda (k, v): (frozenset(k), v)).groupByKey().collect() 

statt set.

# This will fail with TypeError: unhashable type: 'set' 
rdd.map(lambda (k, v): (set(k), v)).groupByKey().collect() 
+0

danke das hilft wirklich viel mit meinem Verständnis von Funken im Allgemeinen –

+0

Gern geschehen. BTW Es ist nicht speziell Spark. Dasselbe gilt, wenn Sie einfache Python-'dicts' oder' sets' verwenden. – zero323