2015-07-14 6 views
5

Sto tentando di chiamare la funzione reduceByKey di pyspark sui dati del formato (([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e], 1), ...un elenco come chiave per reduceByKey di PySpark

Sembra pyspark non accetterà un array come la chiave nella chiave normale, la riduzione del valore semplicemente applicando .reduceByKey (aggiungi).

Ho già provato prima la conversione della matrice in una stringa, per .map((x,y): (str(x),y)) ma questo non funziona perché la post-elaborazione delle stringhe negli array è troppo lenta.

C'è un modo per far sì che pyspark usi la matrice come chiave o usi un'altra funzione per convertire rapidamente le stringhe in array?

qui è il codice di errore associato

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 

SOMMARIO:

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

uscita desiderato y =[([a,b,c], 2), ([a,d,b,e], 1),...] tale che ho potuto accedere a da y[0][0][0] e 2 da y[0][1]

risposta

8

Prova questo:

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

Dal liste di Python sono mutabili significa che non può essere hash (non forniscono __hash__ metodo):

>>> 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' 

tuple da altra parte sono immutabili e fornire __hash__ implementazione del metodo:

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

quindi può essere utilizzato come chiave. Allo stesso modo, se si desidera utilizzare valori unici come chiave si dovrebbe usare frozenset:

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

invece di set.

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

grazie che mi aiuta molto con la mia comprensione della scintilla in generale –

+0

Prego. BTW In particolare non è specifico di Spark. La stessa cosa si applica quando usi i "dicts" o 'sets' di Python. – zero323

Problemi correlati