RDD到多维数组

时间:2015-07-23 20:10:41

标签: python apache-spark pyspark

我正在使用spark的python API,我发现一些矩阵操作具有挑战性。我的RDD是长度为n(行向量)的一维列表。是否可以将其重新整形为大小为sq_root(n)x Sq_root(n)的矩阵/多维数组。

例如,

Vec=[1,2,3,4,5,6,7,8,9]

和期望的输出3 x 3 =

[[1,2,3]
[4,5,6]
[7,8,9]] 

是否有相当于重塑的numpy?

条件: n(> 5000万)是巨大的,因此排除使用.collect(), 并且可以使此进程在多个线程上运行吗?

1 个答案:

答案 0 :(得分:2)

这样的事情应该是诀窍:

rdd = sc.parallelize(xrange(1, 10))
nrow = int(rdd.count() ** 0.5) # Compute number of rows

rows = (rdd.
   zipWithIndex(). # Add index, we assume that data is sorted
   groupBy(lambda (x, i): i / nrow). # Group by row
   # Order by column and drop index
   mapValues(lambda vals: [x for (x, i) in sorted(vals, key=lambda (x, i): i)])))

您可以添加:

from pyspark.mllib.linalg import DenseVector
rows.mapValues(DenseVector)

如果你想要合适的载体。