如何使用dropDuplicates()获得最后一个值?

时间:2019-05-10 11:11:40

标签: apache-spark dataframe pyspark drop-duplicates

假设我有以下Spark数据帧(df):

enter image description here

可以看到,“时间戳记”列中存在重复的值,我想摆脱它们,而在“时间戳记”具有唯一值的行中留空。

我尝试使用此行代码删除重复项:

df.dropDuplicates(['Timestamp'])

看来dropDuplicates()保留了重复行中的第一行,但是我需要在重复行中保留最后一行(表中突出显示的行)。该怎么办?

2 个答案:

答案 0 :(得分:2)

有一种使用groupBylast的解决方法。我们可以通过在除last之外的每一列上定义一个Timestamp聚合器来使其通用。

// let's define the aggregators
val aggs = df.columns
    .filter(_ != "Timestamp")
    .map(c => last(col(c)) as c)
// And use them:
val result = df
    .groupBy("Timestamp")
    .agg(aggs.head, aggs.tail :_*)

答案 1 :(得分:1)

@Oli建议了一个不错的解决方案,我使用它的方式如下(使用python):

exprs = [last(x).alias(x) for x in df.columns if x != 'Timestamp']
df0 = df.groupBy("Timestamp").agg(*exprs)

希望这会帮助可能遇到类似问题的人