Pet*_*oro 7 python apache-spark rdd pyspark
我试图在格式的数据上调用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
Run Code Online (Sandbox Code Playgroud)
摘要:
输入: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]
zer*_*323 10
试试这个:
rdd.map(lambda (k, v): (tuple(k), v)).groupByKey()
Run Code Online (Sandbox Code Playgroud)
由于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'
Run Code Online (Sandbox Code Playgroud)
另一方面,元组是不可变的,并提供__hash__方法实现:
>>> a_tuple = (1, 2, 3)
>>> a_tuple.__hash__ is None
False
>>> hash(a_tuple)
2528502973977326415
Run Code Online (Sandbox Code Playgroud)
因此可以用作关键.同样,如果您想使用唯一值作为键,您应该使用frozenset:
rdd.map(lambda (k, v): (frozenset(k), v)).groupByKey().collect()
Run Code Online (Sandbox Code Playgroud)
而不是set.
# This will fail with TypeError: unhashable type: 'set'
rdd.map(lambda (k, v): (set(k), v)).groupByKey().collect()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3876 次 |
| 最近记录: |