如何从两个列表创建PySpark数据框?

时间:2017-07-31 20:26:30

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我正在研究Databricks,并希望使用Python在Spark中使用MLlib包。当我以前使用Scikit-learn时,我会有一个功能列表,以及另一个功能标签列表。我只是使用决策树分类器来拟合并预测。

看一下文档,我对如何在PySpark上做类似事情感到有点迷茫:https://docs.databricks.com/spark/latest/mllib/binary-classification-mllib-pipelines.html

我相信为了使用MLlib,我需要从数据帧中提取列以用作功能和标签。所以在这样做时,我想知道如何创建一个新的空数据框,然后在其中添加两列,一个是功能列表,另一个是标签列表。

我的功能列表(例如:[2,0,0,1])被称为' ml_list'我的标签列表(例如:[1]或[0])被称为'标签'。

到目前为止,这是我的代码,不确定我是否在正确的道路上。我的功能和标签都是二进制的,所以我选择了IntegerType():

field = [StructField(“ml_list”,IntegerType(), 
True),StructField(“Labels”, IntegerType(), True)]

schema = StructType(field)
df_date = sqlContext.createDataFrame(sc.emptyRDD(), schema)

任何帮助都会很棒,因为我对Spark很陌生。

2 个答案:

答案 0 :(得分:2)

如果你有:

labels = [[0], [1], [0]]

features = [[2, 0, 0, 1], [0, 0, 0, 1], [0, 2, 0, 1]]
你可以:

from pyspark.ml.linalg import Vectors

sc.parallelize(zip(labels, features)).map(lambda lp: (float(lp[0][0]), Vectors.dense(lp[1]))).toDF(["label", "features"])

答案 1 :(得分:2)

可替换地:

from pyspark.ml.linalg import Vectors

dd = [(labels[i][0], Vectors.dense(features[i])) for i in range(len(labels))]
df = spark.createDataFrame(sc.parallelize(dd),schema=["label", "features"])