在PySpark 1.4.1中将SparseVector转换为DenseVector时出现意外错误:
from pyspark.mllib.linalg import SparseVector, DenseVector
DenseVector(SparseVector(5, {4: 1.}))
这在Ubuntu上正常运行,运行pyspark,返回:
DenseVector([0.0, 0.0, 0.0, 0.0, 1.0])
这会导致RedHat出错,运行pyspark,返回:
Traceback (most recent call last): File "", line 1, in File "/usr/lib/spark/python/pyspark/mllib/linalg.py", line 206, in init ar = np.array(ar, dtype=np.float64) File "/usr/lib/spark/python/pyspark/mllib/linalg.py", line 673, in getitem raise ValueError("Index %d out of bounds." % index) ValueError: Index 5 out of bounds.
此外,在两个平台上,评估以下内容也会导致错误:
DenseVector(SparseVector(5, {0: 1.}))
我希望:
DenseVector([1.0, 0.0, 0.0, 0.0, 0.0])
但是得到:
Traceback (most recent call last): File "", line 1, in File "/home/skander/spark-1.4.1-bin-hadoop2.6/python/pyspark/mllib/linalg.py", line 206, in init ar = np.array(ar, dtype=np.float64) File "/home/skander/spark-1.4.1-bin-hadoop2.6/python/pyspark/mllib/linalg.py", line 676, in getitem row_ind = inds[insert_index] IndexError: index out of bounds
注意:虽然错误发生在同一个函数中(代码在https://spark.apache.org/docs/latest/api/python/_modules/pyspark/mllib/linalg.html),但此错误消息与前一个不同
火花2.0.2+
您应该能够迭代
SparseVectors
。见:SPARK-17587。火花<;2.0.2
好吧,第一种情况非常有趣,但总体行为看起来根本不像一个bug。如果您查看DenseVector
构造函数,它只考虑两种情况。ar
是一个^{np.array(ar, dtype=np.float64)
SparseVector
显然不是一个bytes
对象,因此当将其传递给构造函数时,它将使用一个用于np.array
调用的object
参数。如果你检查^{object
应该您可以检查
SparseVector
是否不符合上述条件。它不是Pythonsequence type并且:如果要将
SparseVector
转换为DenseVector
,可能应该使用toArray
方法:编辑:
我认为这种行为解释了
DenseVector(SparseVector(...))
在某些情况下可能起作用的原因:相关问题 更多 >
编程相关推荐