![](/img/trans.png)
[英]How to join three RDDs using the Python Core API (Apache Spark)?
[英]How to join three RDDs in to a tuple?
我对使用Python的Apache Spark还是比较陌生,这就是我想要做的。 我有以下输入数据。
rdd_row
是行索引(i)的RDD, rdd_col
是列索引(j)的RDD, rdd_values
是值(v)的RDD。 以上三个RDD很大。
我正在尝试将它们转换为稀疏的rdd矩阵
rdd_mat= ([rdd_row],[rdd_col],[rdd_values])
即
rdd_mat=([i1,i2,i3 ..],[j1,j2,j3..], [v1,v2,v3 ..])
我努力了:
zip where rdd_row.zip(rdd_col).zip(rdd_val)
但它最终给
[(i1,j1,v1),(i2,j2,v2) ..]
和
rdd1.union(rdd2)
不会创建元组。
非常感谢您在正确的方向上指导我!
不幸的是,在这一点上(Spark 1.4),如果您对线性代数感兴趣,Scala和Java比Python更好。 假设您输入了以下内容:
import numpy as np
np.random.seed(323)
rdd_row = sc.parallelize([0, 1, 1, 2, 3])
rdd_col = sc.parallelize([1, 2, 3, 4, 4])
rdd_vals = sc.parallelize(np.random.uniform(0, 1, size=5))
要获得所需形状的rdd_mat
,可以执行以下操作:
assert rdd_row.count() == rdd_col.count() == rdd_vals.count()
rdd_mat = sc.parallelize(
(rdd_row.collect(), rdd_row.collect(), rdd_vals.collect()))
但这是一个很糟糕的主意。 正如@DeanLa所提到的,这里的并行处理非常有限,更不用说每个部分(例如整个行列表)都将在单个分区/节点上结束。
在不知道如何使用输出的情况下,很难为您提供有意义的建议,但是一种方法是使用以下内容:
from pyspark.mllib.linalg import Vectors
coords = (rdd_row.
zip(rdd_col).
zip(rdd_vals).
map(lambda ((row, col), val): (row, col, val)).
cache())
ncol = coords.map(lambda (row, col, val): col).distinct().count()
rows = (coords.
groupBy(lambda (row, col, val): row)
.mapValues(lambda values: Vectors.sparse(
ncol, sorted((col, val) for (row, col, val) in values))))
它将创建成对的rdd,它们代表给定行的行索引和值的稀疏向量。 如果您添加一些联接或逐列添加,您仍然可以自己实现一些典型的线性代数例程,以实现功能齐全的分布式数据结构,最好使用Scala / Java CoordinateMatrix或org.apache.spark.mllib.linalg.distributed
另一个类org.apache.spark.mllib.linalg.distributed
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.