从列表 PySpark 列表创建单行数据框

Posted

技术标签:

【中文标题】从列表 PySpark 列表创建单行数据框【英文标题】:Create single row dataframe from list of list PySpark 【发布时间】:2018-02-12 11:08:55 【问题描述】:

我有这样的数据 data = [[1.1, 1.2], [1.3, 1.4], [1.5, 1.6]] 我想创建一个 PySpark 数据框

我已经用过了

dataframe = SQLContext.createDataFrame(data, ['features'])

但我总是得到

+--------+---+
|features| _2|
+--------+---+
|     1.1|1.2|
|     1.3|1.4|
|     1.5|1.6|
+--------+---+

我怎样才能得到如下结果?

+----------+
|features  |
+----------+
|[1.1, 1.2]|
|[1.3, 1.4]|
|[1.5, 1.6]|
+----------+

【问题讨论】:

您可以在创建数据框时创建架构并提供 【参考方案1】:

我发现将 createDataFrame() 的参数视为元组列表很有用,其中列表中的每个条目对应于 DataFrame 中的一行,元组的每个元素对应一列。

您可以通过将列表中的每个元素设为元组来获得所需的输出:

data = [([1.1, 1.2],), ([1.3, 1.4],), ([1.5, 1.6],)]
dataframe = sqlCtx.createDataFrame(data, ['features'])
dataframe.show()
#+----------+
#|  features|
#+----------+
#|[1.1, 1.2]|
#|[1.3, 1.4]|
#|[1.5, 1.6]|
#+----------+

或者如果更改源很麻烦,您可以等效地这样做:

data = [[1.1, 1.2], [1.3, 1.4], [1.5, 1.6]]
dataframe = sqlCtx.createDataFrame(map(lambda x: (x, ), data), ['features'])
dataframe.show()
#+----------+
#|  features|
#+----------+
#|[1.1, 1.2]|
#|[1.3, 1.4]|
#|[1.5, 1.6]|
#+----------+

【讨论】:

【参考方案2】:

您需要一个map 函数来将tuples 转换为array 并在createDataFrame 中使用它

dataframe = sqlContext.createDataFrame(sc.parallelize(data).map(lambda x: [x]), ['features'])

你应该得到你想要的

+----------+
|  features|
+----------+
|[1.1, 1.2]|
|[1.3, 1.4]|
|[1.5, 1.6]|
+----------+

【讨论】:

【参考方案3】:

您应该使用 Vector Assembler 函数,从您的代码中我猜您这样做是为了训练机器学习模型,而向量汇编器最适合这种情况。您还可以在管道中添加汇编程序。

assemble_feature=VectorAssembler(inputCol=data.columns,outputCol='features')
pipeline=Pipeline(stages=[assemble_feature])
pipeline.fit(data).transform(data)

【讨论】:

以上是关于从列表 PySpark 列表创建单行数据框的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark:从列表的 RDD 创建一个火花数据框,其中列表的某些元素是对象

pyspark 从 spark 数据框列创建一个不同的列表并在 spark sql where 语句中使用

从列表中创建一个 pyspark 数据框列,其中列表的长度与数据框的行数相同

pyspark dataframe foreach 填充列表

pyspark 行列表的 RDD 到 DataFrame

如何从 pyspark 数据框列中的列表中删除特定字符串