【问题标题】:SparseVector to DenseVector conversion in PysparkPyspark 中的 SparseVector 到 DenseVector 的转换
【发布时间】:2015-12-04 01:55:29
【问题描述】:

在 PySpark 1.4.1 中将 SparseVector 转换为 DenseVector 时出现意外错误:

from pyspark.mllib.linalg import SparseVector, DenseVector

DenseVector(SparseVector(5, {4: 1.}))

这在 Ubuntu 上运行正常,运行 pyspark,返回:

密集向量([0.0, 0.0, 0.0, 0.0, 1.0])

这会导致 RedHat 出现错误,运行 pyspark,返回:

Traceback(最近一次调用最后一次):文件“”,第 1 行,in 文件“/usr/lib/spark/python/pyspark/mllib/linalg.py”,行 206,在 初始化 ar = np.array(ar, dtype=np.float64) 文件“/usr/lib/spark/python/pyspark/mllib/linalg.py”,第 673 行,在 获取项目 raise ValueError("Index %d out of bounds." % index) ValueError: Index 5 out of bounds.


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

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

我希望:

密集向量([1.0, 0.0, 0.0, 0.0, 0.0])

但得到:

  • Ubuntu:

Traceback(最近一次调用最后一次):文件“”,第 1 行,in 文件 “/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 中 row_ind = inds[insert_index] IndexError: index out of bounds

注意:这个错误信息与上一个不同,虽然错误发生在同一个函数中(代码在https://spark.apache.org/docs/latest/api/python/_modules/pyspark/mllib/linalg.html

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

【问题讨论】:

    标签: python numpy apache-spark pyspark


    【解决方案1】:

    Spark 2.0.2+

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

    火花

    嗯,第一种情况很有趣,但整体行为看起来根本不像一个错误。如果你看一下 DenseVector 构造函数,它只考虑了两种情况。 p>

    1. ar 是一个 bytes 对象(0 范围内的不可变整数序列)
    2. 否则我们直接调用np.array(ar, dtype=np.float64)

    SparseVector 显然不是bytes 对象,因此当将其传递给构造函数时,它使用object 参数进行np.array 调用。如果你检查numpy.array docs,你会知道object应该是

    一个数组,任何暴露array interface的对象,一个__array__方法返回一个数组的对象,或者任何(嵌套的)序列。

    您可以检查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.
    

    【讨论】:

    • 好答案。对于第一个问题,我想知道他在两台机器上是否有相同的spark版本和python版本。
    • 谢谢@Paul。我发布了一个应该部分解释这里发生了什么的编辑。
    猜你喜欢
    • 1970-01-01
    • 2017-01-25
    • 2016-12-25
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2018-08-22
    • 2020-11-07
    相关资源
    最近更新 更多