在 PySpark 1.4.1 中将 SparseVector 转换为 DenseVector 时出现意外错误:from pyspark.mllib.linalg import SparseVector, DenseVectorDenseVector(SparseVector(5, {4: 1.}))这在 Ubuntu 上正常运行,运行 pyspark,返回: 这会导致 RedHat 出现错误,运行 pyspark,返回: 此外,在两个平台上,评估以下内容也会导致错误:DenseVector(SparseVector(5, {0: 1.}))我希望: 但得到: Ubuntu: 注意:这个错误信息和上一个不同,虽然错误发生在同一个函数中(代码在 https://spark.apache.org/docs/latest/api/python/_modules/pyspark/mllib/linalg.html ) RedHat:相同的命令会导致 Segmentation Fault,从而导致 Spark 崩溃。 最佳答案 Spark 2.0.2+ 您应该能够迭代 SparseVectors 。请参阅: SPARK-17587 。 Spark 嗯,第一种情况很有趣,但整体行为看起来根本不像是错误。如果您查看 DenseVector 构造函数,它只考虑两种情况。 ar 是一个 bytes 对象(范围为 0 否则我们简单地调用 np.array(ar, dtype=np.float64) SparseVector 显然不是 bytes 对象,所以当将它传递给构造函数时,它被用作 object 调用的 np.array 参数。如果你检查 numpy.array docs 你就会知道 object 应该是 您可以检查 SparseVector 是否不符合上述条件。它不是 Python sequence type 并且: >>> sv = SparseVector(5, {4: 1.})>>> isinstance(sv, np.ndarray)False>>> hasattr(sv, "__array_interface__")False>>> hasattr(sv, "__array__")False>>> hasattr(sv, "__iter__")False如果你想将 SparseVector 转换为 DenseVector 你应该使用 toArray 方法: DenseVector(sv.toArray()) 编辑 :我认为这种行为解释了为什么 DenseVector(SparseVector(...)) 在某些情况下可能起作用: >>> [x for x in SparseVector(5, {0: 1.})][1.0]>>> [x for x in SparseVector(5, {4: 1.})]Traceback (most recent call last):...ValueError: Index 5 out of bounds.关于python - Pyspark 中的 SparseVector 到 DenseVector 的转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32456808/
10-12 21:25