【问题标题】:Pyspark - add another column to a sparse vector columnPyspark - 将另一列添加到稀疏向量列
【发布时间】:2018-07-02 20:24:34
【问题描述】:

我有一个 PySpark 数据框,其中一列 (features) 是稀疏向量。例如:

+------------------+-----+
|     features     |label|
+------------------+-----+
| (4823,[87],[0.0])|  0.0|
| (4823,[31],[2.0])|  0.0|
|(4823,[159],[0.0])|  1.0|
|  (4823,[1],[7.0])|  0.0|
|(4823,[15],[27.0])|  0.0|
+------------------+-----+

我想扩展features 列并为其添加另一个功能,例如:

+-------------------+-----+
|     features      |label|
+-------------------+-----+
| (4824,[87],[0.0]) |  0.0|
| (4824,[31],[2.0]) |  0.0|
|(4824,[159],[0.0]) |  1.0|
|  (4824,[1],[7.0]) |  0.0|
|(4824,[4824],[7.0])|  0.0|
+-------------------+-----+

有没有一种方法可以做到这一点,而无需将SparseVector 解包为密集,然后用新列将其重新打包为稀疏?

【问题讨论】:

    标签: python apache-spark dataframe pyspark sparse-matrix


    【解决方案1】:

    使用 ML 库中的 VectorAssembler 转换器可以最简单地向现有 SparseVector 添加新列。它会自动将列组合成一个向量(DenseVectorSparseVector,具体取决于哪个使用最少的内存)。使用VectorAssembler不会在合并过程中将向量转换为DenseVector(请参阅source code)。可以这样使用:

    df = ...
    
    assembler = VectorAssembler(
        inputCols=["features", "new_col"],
        outputCol="features")
    
    output = assembler.transform(df)
    

    要简单地增加SparseVector 的大小,而不添加任何新值,只需创建一个更大的新向量:

    def add_empty_col_(v):
        return SparseVector(v.size + 1, v.indices, v.values)
    
    add_empty_col = udf(add_empty_col_, VectorUDT())
    df.withColumn("sparse", add_empty_col(col("features"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2020-05-22
      • 2017-06-15
      • 2021-11-18
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      相关资源
      最近更新 更多