Dataframe 如何将pyspark数据帧1x9转换为3x3
我正在使用pyspark数据帧。 我有一个df是1x9 范例Dataframe 如何将pyspark数据帧1x9转换为3x3,dataframe,pyspark,transformation,Dataframe,Pyspark,Transformation,我正在使用pyspark数据帧。 我有一个df是1x9 范例 temp = spark.read.option("sep","\n").csv("temp.txt") 温度: 在不使用熊猫库的情况下,如何将其转换为包含列名称、年龄、城市的3x3数据帧 像这样: 姓名、年龄、城市 山姆,11岁,纽约 约翰,13岁,波士顿 我将以rdd的形式读取该文件,以利用zipWithIndex为数据添加索引 rdd = sc.textFile("t
temp = spark.read.option("sep","\n").csv("temp.txt")
温度:
在不使用熊猫库的情况下,如何将其转换为包含列名称、年龄、城市的3x3数据帧
像这样:
姓名、年龄、城市
山姆,11岁,纽约
约翰,13岁,波士顿
我将以
rdd
的形式读取该文件,以利用zipWithIndex
为数据添加索引
rdd = sc.textFile("temp.txt")
我们现在可以使用截断除法来创建一个索引,用它将记录分组在一起。将此新索引用作rdd
的键。相应的值
将是报头的元组,可以使用模数和实际值来计算。(请注意,zipWithIndex
返回的索引将位于记录的末尾,这就是为什么我们使用行[1]
作为分区/mod。)
接下来使用reduceByKey
将值添加到元组中。这将为您提供一组键和值(按顺序)。使用map
将其转换为行
(保留列标题等)
最后使用toDF()
转换为数据帧。您可以使用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|
#+----+---+-------+
我将以rdd
的形式读取该文件,以利用zipWithIndex
为数据添加索引
rdd = sc.textFile("temp.txt")
我们现在可以使用截断除法来创建一个索引,用它将记录分组在一起。将此新索引用作rdd
的键。相应的值
将是报头的元组,可以使用模数和实际值来计算。(请注意,zipWithIndex
返回的索引将位于记录的末尾,这就是为什么我们使用行[1]
作为分区/mod。)
接下来使用reduceByKey
将值添加到元组中。这将为您提供一组键和值(按顺序)。使用map
将其转换为行
(保留列标题等)
最后使用toDF()
转换为数据帧。您可以使用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|
#+----+---+-------+
可以做到,但效率不高。效率不是问题。可以做到,但效率不高。效率不是问题。