如何将 pyspark 数据帧 1x9 转换为 3x3

Posted

技术标签:

【中文标题】如何将 pyspark 数据帧 1x9 转换为 3x3【英文标题】:How to transform pyspark dataframe 1x9 to 3x3 【发布时间】:2019-11-04 18:56:42 【问题描述】:

我正在使用 pyspark 数据框。 我有一个 1x9 的 df

例子

temp = spark.read.option("sep","\n").csv("temp.txt")

温度:

sam
11
newyork
john
13
boston
eric
22
texas

不使用 Pandas 库,如何将其转换为 3x3 数据框,列名称、年龄、城市?

像这样:

姓名、年龄、城市

山姆,11,纽约

约翰,13,波士顿

【问题讨论】:

可以,但是效率不高。 效率不是问题。 【参考方案1】:

我会将文件读取为rdd,以利用zipWithIndex 为您的数据添加索引。

rdd = sc.textFile("temp.txt")

我们现在可以使用截断除法来创建一个索引来将记录分组在一起。将此新索引用作keyrdd。对应的values 将是标题的元组,可以使用模数和实际值来计算。 (注意zipWithIndex返回的索引将在记录的末尾,这就是为什么我们使用row[1]作为除法/mod。)

接下来将reduceByKeyadd 的值tuples 一起使用。这将为您提供一个键和值的元组(按顺序)。使用map 将其转换为Row(以保留列标题等)。

最后使用toDF() 转换为DataFrame。您可以使用select(header) 来获取所需顺序的列。

from operator import add
from pyspark.sql import Row

header = ["name", "age", "city"]

df = rdd.zipWithIndex()\
    .map(lambda row: (row[1]//3, (header[row[1]%3], row[0])))\
    .reduceByKey(add)\
    .map(lambda row: Row(**dict(zip(row[1][::2], row[1][1::2]))))\
    .toDF()\
    .select(header)

df.show()
#+----+---+-------+
#|name|age|   city|
#+----+---+-------+
#| sam| 11|newyork|
#|eric| 22|  texas|
#|john| 13| boston|
#+----+---+-------+

【讨论】:

以上是关于如何将 pyspark 数据帧 1x9 转换为 3x3的主要内容,如果未能解决你的问题,请参考以下文章

将 pyspark 数据帧转换为标记的点对象

将 numpy 数组的 rdd 转换为 pyspark 数据帧

Pyspark 将 json 数组转换为数据帧行

通过 pyspark.sql.dataframe 将 XML 数据转换为 pandas 数据帧

将 pyspark 数据帧转换为 pandas 数据帧

如何将 Pyspark 数据帧存储到 HBase