如何将三个RDD加入元组?

时间:2015-07-15 16:52:45

标签: python apache-spark tuples rdd pyspark

我对Python中的Apache Spark相对较新,这就是我想要做的。我输入数据如下。

  • rdd_col是行索引(i)的RDD,
  • rdd_values是列索引(j)的RDD,
  • rdd_mat= ([rdd_row],[rdd_col],[rdd_values]) 是值(v)的RDD。

上述三个RDD非常庞大。

我正在尝试将它们转换为稀疏的rdd矩阵

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) 

var Xray = require('x-ray');
var x = Xray();

x('http://www.rte.ie', {
    title: 'title',
    metatags: x('meta', [{
        name: 'meta@name',
        description: 'meta@content'
  }]),
    meta: 'meta'
})(function (err, obj) {
    console.log(obj);
})

不会创建元组。

非常感谢帮助指导我正确的方向!

1 个答案:

答案 0 :(得分:3)

不幸的是在这一点上(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的其他类< / p>