我有一个如下的Dataframe
我想得到一个Dataframe,它将具有最新版本和最新日期。第一个筛选条件将是最新版本,然后是最新日期生成的Dataframe如下所示
我是用窗口函数来实现的。我写了下面的一段代码。
wind = Window.partitionBy("id")
data = data.withColumn("maxVersion", F.max("version").over(wind)) \
.withColumn("maxDt", F.max("dt").over(wind)) \
.where(F.col("version") == F.col("maxVersion")) \
.where(F.col("maxDt") == F.col("dt")) \
.drop(F.col("maxVersion")) \
.drop(F.col("maxDt"))
我不确定我错过了哪里。我只得到一个id为100的输出。请帮我解决这个问题
3条答案
按热度按时间xxb16uws1#
正如您所提到的,在您的操作中有一个顺序:首先是版本然后是dt基本上,您只需要选择最大版本(删除所有其他内容),然后选择最大dt并删除所有其他内容。您只需切换两行,如下所示:
ID100只有一行的原因是因为在这种情况下,最大版本和最大dt发生在同一行上(你很幸运)。但对于身份证号码200来说不是这样的。
t0ybt7op2#
基本上你的公式有几个问题。首先,您需要将日期从字符串更改为正确的日期格式。然后,pyspark中的窗口允许您逐个指定列的顺序。然后就是了
rank()
函数,允许您在窗口中对结果进行排序。最后剩下的就是选择第一个等级。输出:
tquggr8v3#
一个更整洁的方法可能是: