我有(key,value)元素的RDD。键是NumPy数组。 NumPy数组不可清除,当我尝试进行reduceByKey
操作时会出现问题。
有没有办法用我的手动哈希函数提供Spark上下文?或者有没有其他方法解决这个问题(除了实际散列数组“离线”并传递给Spark只是哈希键)?
以下是一个例子:
import numpy as np
from pyspark import SparkContext
sc = SparkContext()
data = np.array([[1,2,3],[4,5,6],[1,2,3],[4,5,6]])
rd = sc.parallelize(data).map(lambda x: (x,np.sum(x))).reduceByKey(lambda x,y: x+y)
rd.collect()
错误是:
通话时发生错误 Z:org.apache.spark.api.python.PythonRDD.collectAndServe
...
TypeError:不可用类型:'numpy.ndarray'
答案 0 :(得分:2)
最简单的解决方案是将其转换为可清除的对象。例如:
from operator import add
reduced = sc.parallelize(data).map(
lambda x: (tuple(x), x.sum())
).reduceByKey(add)
并在以后需要时将其转换回来。
有没有办法用我的手动哈希函数提供Spark上下文
不是一个简单的。整个机制依赖于事实对象实现__hash__
方法,并且C扩展不能被猴子修补。您可以尝试使用调度来覆盖pyspark.rdd.portable_hash
但我怀疑即使您考虑转换成本也值得。