将列表转换为pyspark数据帧

时间:2017-10-19 07:23:32

标签: python list pyspark apache-spark-sql spark-dataframe

使用pyspark 2.1,我试图找到一些预测结果,代码如下所示

restultSet=testingData.map(lambda p: (p.label, linearModel.predict(p.features))).collect()

现在restultSet的输出在列表中,它看起来像下面的

[(2.0, array([ 2.09078012])), (2.0, array([ 2.09078012])), (2.0, array([ 2.09078012])), (1.0, array([ 2.09078012])), (2.0, array([ 2.09078012])), (1.0, array([ 2.09078012]))]

当我有提供类型(restultSet)时,它显示在结果

下面

我正在努力将列表转换为数据帧

我尝试使用下面的代码段,但它不起作用。请帮忙

restultSet.toDF()

1 个答案:

答案 0 :(得分:2)

您无法将restultSet转换为Spark数据帧,因为collect,它是 Python列表,而toDF适用于RDD。

删除collect,再添加一个map以将您的numpy数组转换为Vectors.dense就可以完成这项工作。

以下是您提供的数据示例:

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

# your data as an RDD (i.e. before 'collect')
dd = sc.parallelize([(2.0, np.array([ 2.09078012])), (2.0, np.array([ 2.09078012])), (2.0, np.array([ 2.09078012])), (1.0, np.array([ 2.09078012])), (2.0, np.array([ 2.09078012])), (1.0, np.array([ 2.09078012]))])
dd.take(1)
# [(2.0, array([ 2.09078012]))]

df = dd.map(lambda x: (x[0], Vectors.dense(x[1]))).toDF()
df.show()
# +---+------------+ 
# | _1|          _2|
# +---+------------+
# |2.0|[2.09078012]| 
# |2.0|[2.09078012]|
# |2.0|[2.09078012]|
# |1.0|[2.09078012]|
# |2.0|[2.09078012]|
# |1.0|[2.09078012]|
# +---+------------+

要为结果列指定名称,请将它们作为toDF中的列表参数包括在内,即toDF(["column_1", "column_2"])