如何将 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")
我们现在可以使用截断除法来创建一个索引来将记录分组在一起。将此新索引用作key
的rdd
。对应的values
将是标题的元组,可以使用模数和实际值来计算。 (注意zipWithIndex
返回的索引将在记录的末尾,这就是为什么我们使用row[1]
作为除法/mod。)
接下来将reduceByKey
与add
的值tuple
s 一起使用。这将为您提供一个键和值的元组(按顺序)。使用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的主要内容,如果未能解决你的问题,请参考以下文章
将 numpy 数组的 rdd 转换为 pyspark 数据帧