2015-07-14 13 views
5

Tôi đang cố gắng để gọi hàm reduceByKey của pyspark trên dữ liệu của các định dạng (([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e], 1), ...Một danh sách như một chìa khóa cho reduceByKey PySpark của

Dường pyspark sẽ không chấp nhận một mảng như là chìa khóa trong khóa bình thường, giảm giá trị bằng cách đơn giản áp dụng .reduceByKey (thêm).

Trước tiên, tôi đã thử chuyển đổi mảng thành chuỗi, bằng cách .map((x,y): (str(x),y)) nhưng điều này không hoạt động do xử lý bài của chuỗi trở lại thành mảng quá chậm.

Có cách nào tôi có thể làm cho pyspark sử dụng mảng làm khóa hoặc sử dụng chức năng khác để nhanh chóng chuyển đổi chuỗi trở lại mảng không?

đây là mã lỗi liên quan đến

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 

TÓM TẮT:

đầu vào: x =[([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e], 1), ...]

đầu ra mong muốn: y =[([a,b,c], 2), ([a,d,b,e], 1),...] như vậy mà tôi có thể truy cập vào a bởi y[0][0][0]2 bởi y[0][1]

.210

Trả lời

8

Hãy thử điều này:

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

Kể từ danh sách Python là có thể thay đổi nó có nghĩa là không thể được băm (không cung cấp __hash__ phương pháp):

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

Tuples từ Mặt khác là không thay đổi và cung cấp __hash__ triển khai phương thức:

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

do đó có thể được sử dụng làm khóa. Tương tự, nếu bạn muốn sử dụng các giá trị duy nhất làm khóa, bạn nên sử dụng frozenset:

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

thay vì set.

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

cảm ơn điều đó thực sự giúp ích rất nhiều cho sự hiểu biết của tôi về tia lửa nói chung –

+0

Bạn được chào đón. BTW Nó không phải là Spark cụ thể cụ thể. Điều tương tự cũng áp dụng khi bạn sử dụng Python đơn giản 'dicts' hoặc' sets'. – zero323

Các vấn đề liên quan