【问题标题】:How to transform pyspark dataframe 1x9 to 3x3如何将 pyspark 数据帧 1x9 转换为 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,波士顿
【问题讨论】:
标签:
dataframe
pyspark
transformation
【解决方案1】:
我会将文件读取为rdd,以利用zipWithIndex 为您的数据添加索引。
rdd = sc.textFile("temp.txt")
我们现在可以使用截断除法来创建一个索引来将记录分组在一起。将此新索引用作key 的rdd。对应的values 将是标题的元组,可以使用模数和实际值来计算。 (注意zipWithIndex返回的索引将在记录的末尾,这就是为什么我们使用row[1]作为除法/mod。)
接下来将reduceByKey 与add 的值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|
#+----+---+-------+