假设我有以下Spark数据帧(df):
可以看到,“时间戳记”列中存在重复的值,我想摆脱它们,而在“时间戳记”具有唯一值的行中留空。
我尝试使用此行代码删除重复项:
df.dropDuplicates(['Timestamp'])
看来dropDuplicates()
保留了重复行中的第一行,但是我需要在重复行中保留最后一行(表中突出显示的行)。该怎么办?
答案 0 :(得分:2)
有一种使用groupBy
和last
的解决方法。我们可以通过在除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)
希望这会帮助可能遇到类似问题的人