【发布时间】:2022-01-26 06:23:13
【问题描述】:
我有一个数据框,其中一些行重复 ids 但不同 timestamp 和一些行重复 ids 但相同 timestamp 但具有以下之一(yob 和 gender)列为空。现在我想用 groupby 做一个操作:
- 如果相同的
id有不同的timestamp,想获取最近的时间戳。 - 如果相同的
ids具有相同的timestamp但任何列具有空值(yob和gender),那时,想要将id合并为没有空值的单个记录。下面我粘贴了数据框和所需的输出。
输入数据
from pyspark.sql.functions import col, max as max_
df = sc.parallelize([
("e5882", "null", "M", "AD", "9/14/2021 13:50"),
("e5882", "null", "M", "AD", "10/22/2021 13:10"),
("5cddf", "null", "M", "ED", "9/9/2021 12:00"),
("5cddf", "2010", "null", "ED", "9/9/2021 12:00"),
("c3882", "null", "M", "BD", "11/27/2021 5:00"),
("c3882", "1975", "null", "BD", "11/27/2021 5:00"),
("9297d","1999", "null", "GF","10/18/2021 7:00"),
("9298e","1990","null","GF","10/18/2021 7:00")
]).toDF(["ID", "yob", "gender","country","timestamp"])
期望输出:
在这个问题中使用的代码,但没有得到准确的结果,一些ids丢失了,
w = Window.partitionBy('Id')
# to obtain the recent date
df1 = df.withColumn('maxB', F.max('timestamp').over(w)).where(F.col('timestamp') == F.col('maxB')).drop('maxB')
# to merge the null column based of id
(df1.groupBy('Id').agg(*[F.first(x,ignorenulls=True) for x in df1.columns if x!='Id'])).show()
【问题讨论】:
标签: dataframe apache-spark pyspark apache-spark-sql