python - 按元素乘以稀疏向量

标签 python apache-spark pyspark sparse-matrix

我有 2RDD,我想在这 2 个 rdd 之间按元素相乘。

假设我有以下 RDD(示例):

a = ((1,[0.28,1,0.55]),(2,[0.28,1,0.55]),(3,[0.28,1,0.55]))
aRDD = sc.parallelize(a)
b = ((1,[0.28,0,0]),(2,[0,0,0]),(3,[0,1,0]))
bRDD = sc.parallelize(b)

可以看出,b 是稀疏的,我想避免将零值与另一个值相乘。我正在执行以下操作:

from pyspark.mllib.linalg import Vectors
def create_sparce_matrix(a_list):
    length = len(a_list)
    index = [i for i ,e in enumerate(a_list) if e !=0]
    value = [e for i ,e in enumerate(a_list) if e !=0]
    sv1 = Vectors.sparse(length,index,value)
    return sv1


brdd = b.map(lambda (ids,a_list):(ids,create_sparce_matrix(a_list)))

和乘法:

combinedRDD = ardd + brdd
result = combinedRDD.reduceByKey(lambda a,b:[c*d for c,d in zip(a,b)])

我似乎无法将稀疏数据与 RDD 中的列表相乘。有没有办法做到这一点?或者当两个 RDD 之一有很多零值时,另一种有效的逐元素相乘方法?

最佳答案

处理此问题的一种方法是将 aRDD 转换为 RDD[DenseVector]:

from pyspark.mllib.linalg import SparseVector, DenseVector, Vectors

aRDD = sc.parallelize(a).mapValues(DenseVector)
bRDD = sc.parallelize(b).mapValues(create_sparce_matrix)

并使用基本的 NumPy 操作:

def mul(x, y):
    assert isinstance(x, DenseVector)
    assert isinstance(y, SparseVector)
    assert x.size == y.size
    return SparseVector(y.size, y.indices, x[y.indices] * y.values)

aRDD.join(bRDD).mapValues(lambda xy: mul(*xy))

关于python - 按元素乘以稀疏向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35363542/

相关文章:

python - 如何在 Django 中的同一个应用程序中使用不同的数据库?

apache-spark - spark上的tensorflow与默认的分布式tensorflow 1.0有什么区别?

apache-spark - Spark SQL 在 where 子句的时间戳之间?

python - Pyspark,在字符串中间添加一个字符

python - 在 PySpark 中使用字典进行情感分析

Python正则表达式引擎字符类中的转义括号

python - 等待来自 URL : HTTPException 的 HTTP 响应时超出截止日期

Python2.7 argparse.parse_known_args 解析错误

python - PySpark使用RDD和json.load解析Json

python - 在 PySpark 日期列中获取每年的最新日期