求和PySpark中SparseVectors的一列?

问题描述 投票:0回答:1

我有一列这样的SparseVectors:

+--------------------+
|      features_array|
+--------------------+
|(11,[1,2,3],[1.0,...|
|(11,[1,2],[1.0,1.0])|
|(11,[1,2],[1.0,1.0])|
|(11,[1,4],[1.0,1.0])|
|(11,[1,3,4],[1.0,...|
+--------------------+

并且只想对所有行求和而不先转换为RDD。我应该只给出一个稀疏向量。有人可以帮我吗?我已经尝试了很多方法,但是不断出现一堆架构不匹配错误。

如果我有密集的向量,则输入和输出将像这样:

输入:

feature_array
[1,2]
[3,5] 

输出:

feature_array
[4,7]

谢谢!

python pyspark apache-spark-mllib
1个回答
0
投票
我的样本数据:

df.show() +---+--------------------+ | id| features_array| +---+--------------------+ | 0| (5,[1],[2.0])| | 5| (5,[0,3],[5.0,1.0])| | 1|[1.0,1.0,3.0,1.0,...| | 3| (5,[0,1],[3.0,1.0])| | 2|[2.0,1.0,3.0,1.0,...| | 4| (5,[0,1],[4.0,1.0])| +---+--------------------+

首先将整个向量转换为字符串,然后使用正则表达式对进行展平,然后拆分以转换数组,然后将高阶函数聚合为求和。

(spark2.4 +)

from pyspark.sql import functions as F from pyspark.sql.types import * df1=df.withColumn("features1", F.split(F.regexp_replace((F.regexp_replace(F.regexp_replace(F.col("features_array").cast("string"),'\(','['),'\)',']')),'\[|]',''),',').cast(ArrayType(IntegerType())))\ .withColumn("sum_of_features", F.expr("""aggregate(features1, 0, (acc, x) -> acc + x)""")).drop("features1") df1.show() +---+--------------------+---------------+ | id| features_array|sum_of_features| +---+--------------------+---------------+ | 0| (5,[1],[2.0])| 8| | 5| (5,[0,3],[5.0,1.0])| 14| | 1|[1.0,1.0,3.0,1.0,...| 6| | 3| (5,[0,1],[3.0,1.0])| 10| | 2|[2.0,1.0,3.0,1.0,...| 8| | 4| (5,[0,1],[4.0,1.0])| 11| +---+--------------------+---------------+ df1.select(F.sum("sum_of_features")).show() +--------------------+ |sum(sum_of_features)| +--------------------+ | 57| +--------------------+
© www.soinside.com 2019 - 2024. All rights reserved.