将 Spark DataFrame 收集为 Numpy 矩阵

3
我已经使用Spark计算了大型数据集上的PCA,现在我有一个具有以下结构的Spark数据框:
Row('pcaFeatures'=DenseVector(elem1,emlem2..)) 

“elem1,...,elemN是双精度数字。我想将它转换为numpy矩阵。现在我正在使用以下代码:”
numpymatrix = datapca.toPandas().as_Matrix()

但是我得到的是一个元素类型为对象的numpy序列,而不是数值矩阵。有没有办法获取我需要的矩阵?
1个回答

2

只有当生成的数据适合主内存(即您可以安全地使用 collect())时,您的请求才有意义;另一方面,如果是这种情况,无可否认的是您根本没有理由使用 Spark。

无论如何,在做出这个假设的情况下,以下是将单列features Spark 数据框(DenseVectorRows)转换为NumPy数组的通用方法,使用玩具数据:

spark.version
# u'2.2.0' 

from pyspark.ml.linalg import Vectors
import numpy as np

# toy data:
df = spark.createDataFrame([(Vectors.dense([0,45,63,0,0,0,0]),),
                            (Vectors.dense([0,0,0,85,0,69,0]),),
                            (Vectors.dense([0,89,56,0,0,0,0]) ,),
                           ], ['features'])

dd = df.collect()
dd
# [Row(features=DenseVector([0.0, 45.0, 63.0, 0.0, 0.0, 0.0, 0.0])), 
#  Row(features=DenseVector([0.0, 0.0, 0.0, 85.0, 0.0, 69.0, 0.0])), 
#  Row(features=DenseVector([0.0, 89.0, 56.0, 0.0, 0.0, 0.0, 0.0]))] 

np.asarray([x[0] for x in dd])
# array([[ 0., 45., 63., 0., 0., 0., 0.],
#        [ 0., 0., 0., 85., 0., 69., 0.],
#        [ 0., 89., 56., 0., 0., 0., 0.]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接