使用pyspark将Dataframe中的多个列解压为行

9jyewag0  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(429)

这个问题在这里已经有了答案

spark sql/pyspark中的unpivot(1个答案)
两个月前关门了。
这是作为作业的一部分给我们的卡格尔难题。我试图使用sparksql将31天的列解压到行中,并意识到使用sparksql是不可能的。
数据框包含以下列: id, item_id, dept_id, cat_id, store_id, state_id and day1 to day 31 .

如何使用Dataframe将31天的列转换为行。有一个基于Pandas的解决方案。但是我怎么能用pyspark呢?

ijnw1ujt

ijnw1ujt1#

您可以使用explode函数来完成此操作。首先将所有列日放入一个数组:

import pyspark.sql.functions as f

# Join day columns in array

day_columns = [x if x.startswith("d_") for x in df.columns]
df = df.withColumn("days", f.array(day_columns))

# Drop day columns

df = df.drop(day_columns)

使用posexplode函数分解数组,得到每个值的日期:

df = df.select("id", "item_id", "dept_id", "cat_id", "store_id", "state_id", f.posexplode("days"))

最后,过滤没有日期的值:

df = df .filter(f.col("col") > 0).withColumnRenamed("pos", "day").drop("col")

相关问题