一个列表作为PySpark的reduceByKey的键
我正在尝试对格式的数据调用pyspark的reduceByKey函数 (([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e],
1), ...
似乎pyspark不会接受数组作为普通键中的键,通过简单地应用.reduceByKey(add)可以减少值。
我已经尝试过先将数组转换为字符串,.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]
-
尝试这个:
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()