【问题标题】: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")

我们现在可以使用截断除法来创建一个索引来将记录分组在一起。将此新索引用作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|
#+----+---+-------+

【讨论】:

    猜你喜欢
    • 2020-07-31
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 2021-11-16
    • 2017-01-25
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多