Python Pyspark中SparseVector到DenseVector的转换

Python Pyspark中SparseVector到DenseVector的转换,python,numpy,apache-spark,pyspark,Python,Numpy,Apache Spark,Pyspark,在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时出错,返回: 回溯(最近一次调用):

在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时出错,返回:

回溯(最近一次调用):文件“”,第1行,在 文件“/usr/lib/spark/python/pyspark/mllib/linalg.py”,第行 206,在init中 ar=np.array(ar,dtype=np.float64)文件“/usr/lib/spark/python/pyspark/mllib/linalg.py”,第673行,在 getitem raise VALUERROR(“索引%d超出范围”。%Index)VALUERROR:索引5超出范围


此外,在这两个平台上,评估以下内容也会导致错误:

DenseVector(SparseVector(5, {0: 1.}))
我希望:

DenseVector([1.0,0.0,0.0,0.0,0.0])

但是你可以得到:

  • Ubuntu:
回溯(最近一次调用):文件“”,第1行,在 文件 “/home/skander/spark-1.4.1-bin-hadoop2.6/python/pyspark/mllib/linalg.py”, 第206行,在init ar=np.array(ar,dtype=np.float64)文件“/home/skander/spark-1.4.1-bin-hadoop2.6/python/pyspark/mllib/linalg.py”, 第676行,在getitem 行索引=inds[插入索引]索引器:索引超出范围

注意:此错误消息与上一条不同,尽管错误发生在同一个函数中(代码在)

  • RedHat:相同的命令会导致分段错误,从而导致Spark崩溃

Spark 2.0.2+

您应该能够迭代
SparseVectors
。请参阅:

火花<2.0.2

第一个案例很有趣,但总体行为看起来一点也不像一个bug。如果查看
DenseVector
构造函数,它只考虑两种情况


  • ar
    是一个对象(范围为0的整数的不可变序列)。对于第一个问题,我想知道他在两台机器上是否有相同的spark版本和python版本。谢谢@Paul。我发布了一篇编辑文章,部分解释了这里发生的事情。