Spark:当键是不可清除的numpy数组时,如何“reduceByKey”?

时间:2016-09-21 15:29:01

标签: python numpy pyspark rdd

我有(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'

1 个答案:

答案 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但我怀疑即使您考虑转换成本也值得。