2015-07-14 4 views
5

Я пытаюсь вызвать функцию reduceByKey из pyspark данных формата (([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e], 1), ...список в качестве ключа для reduceByKey PySpark в

Кажется pyspark не будет принимать массив в качестве ключа в нормальном ключе, снижения стоимости путем простого применение .reduceByKey (добавить).

Я уже пробовал сначала преобразовать массив в строку, .map((x,y): (str(x),y)), но это не работает, потому что пост-обработка строк обратно в массивы происходит слишком медленно.

Есть ли способ заставить pyspark использовать массив в качестве ключа или использовать другую функцию для быстрого преобразования строк обратно в массивы?

здесь является ассоциированным код ошибки

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 

СУЩНОСТЬ:

вход: x =[([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e], 1), ...]

требуемый выход: y =[([a,b,c], 2), ([a,d,b,e], 1),...] таким образом, чтобы я мог получить доступ к a по y[0][0][0] и 2 от y[0][1]

ответ

8

Попробуйте это:

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

Поскольку списки Python изменчивы это означает, что не может быть хэшируются (не обеспечивает __hash__ метода):

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

кортежей с другой стороны, являются незыблемыми и обеспечивают __hash__ метод осуществления:

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

следовательно можно использовать в качестве ключа. Точно так же, если вы хотите использовать уникальные значения в качестве ключа следует использовать frozenset:

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

вместо set.

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

спасибо, что очень помогает в моем понимании искры вообще –

+0

Добро пожаловать. BTW В частности, это не Spark. То же самое происходит, когда вы используете простые пиктоны 'dicts' или' sets'. – zero323

Смежные вопросы