簡體   English   中英

如何將三個RDD加入一個元組?

[英]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 CoordinateMatrixorg.apache.spark.mllib.linalg.distributed另一個類org.apache.spark.mllib.linalg.distributed

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM