作为 PySpark 的 reduceByKey 键的列表
A list as a key for PySpark's reduceByKey
我正在尝试对 (([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e], 1), ...
格式的数据调用 pyspark 的 reduceByKey 函数
pyspark 似乎不会接受数组作为普通键中的键,通过简单地应用 .reduceByKey(add) 来减少值。
我已经尝试先通过 .map((x,y): (str(x),y))
将数组转换为字符串,但这不起作用,因为 post 将字符串处理回数组太慢了。
有没有办法让 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),...]
这样我就可以通过 y[0][0][0]
访问 a
并通过 y[0][1]
访问 2
试试这个:
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()
我正在尝试对 (([a,b,c], 1), ([a,b,c], 1), ([a,d,b,e], 1), ...
pyspark 似乎不会接受数组作为普通键中的键,通过简单地应用 .reduceByKey(add) 来减少值。
我已经尝试先通过 .map((x,y): (str(x),y))
将数组转换为字符串,但这不起作用,因为 post 将字符串处理回数组太慢了。
有没有办法让 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),...]
这样我就可以通过 y[0][0][0]
访问 a
并通过 y[0][1]
2
试试这个:
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()