我有个需求,根据id去重保留update_time最新的一条数据
假设有一个dataset叫my_table,将他注册成临时表my_table,其中包含id、update_time和其他字段,如果使用Spark SQL语句根据id去重并保留update_time最新的一条数据:代码如下
SELECT id, MAX(update_time) AS update_time, $other_fields
FROM my_table
GROUP BY id, $other_fields
这样,就可以根据id去重并保留update_time最新的一条数据了。但是需要other_fields,而我有一百多个字段,我可不想码这么多字段,于是找到了简化的办法。
使用dropDuplicates去重
dropDuplicates是一个Spark SQL中的方法,用于去除DataFrame或Dataset中的重复记录。其原理如下:
- 根据指定的列或所有列,对DataFrame或Dataset进行分组,将相同的记录放在一起;
- 对于每个分组,选择其中一个记录作为代表,其余记录都被视为重复记录;
- 将代表记录保留下来,删除所有重复记录,返回一个新的DataFrame或Dataset。
具体来说,dropDuplicates会执行以下步骤:
- 使用groupBy方法按照指定的列或所有列进行分组;
- 使用agg方法和first函数选择每个分组中的第一条记录作为代表;
- 将代表记录保留下来,删除所有重复记录,返回一个新的DataFrame或Dataset。
需要注意的是,dropDuplicates方法默认对所有列进行去重,如果要对指定列进行去重,可以将列名作为参数传递给dropDuplicates方法。此外,dropDuplicates方法会保留第一次出现的记录而删除后续出现的记录,如果需要保留最后一次出现的记录,可以先使用orderBy方法对指定列进行排序,再使用dropDuplicates方法。
代码如下:
Dataset<Row> myDf= sparkSession.read().parquet(inputPath);
Dataset<Row> distinct = myDf.sort(col("update_time").desc()).dropDuplicates("id");