将Spark数据帧收集到Numpy矩阵中

时间:2018-01-28 16:35:22

标签: numpy pyspark spark-dataframe

我使用spark来计算大型数据集上的PCA,现在我有一个具有以下结构的spark数据帧:

Row('pcaFeatures'=DenseVector(elem1,emlem2..)) 

其中elem1,...,elemN是双数。我想在一个numpy矩阵中进行转换。现在我正在使用以下代码:

numpymatrix = datapca.toPandas().as_Matrix()

但是我得到了一个numpy系列,其中包含Object类型的元素而不是数字矩阵。有没有办法得到我需要的矩阵?

1 个答案:

答案 0 :(得分:1)

只有当结果数据适合您的主存储器时,您的请求才有意义(即您可以安全地使用collect());另一方面,如果是这种情况,诚然,你完全没有理由使用Spark。

无论如何,根据这个假设,这里是使用玩具数据将单列features Spark数据帧(Rows DenseVector)转换为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.]])