我正在使用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(), 并且可以使此进程在多个线程上运行吗?
答案 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)
如果你想要合适的载体。