spark sql去重简化方法

文章介绍了如何在SparkSQL中根据id去重并保留update_time最新的数据行。通过使用dropDuplicates方法或者结合groupBy和agg函数,可以实现这一目标。如果要基于特定列去重并保留最新记录,需要先对时间列进行排序,然后应用dropDuplicates。
摘要由CSDN通过智能技术生成

我有个需求,根据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会执行以下步骤:

  1. 使用groupBy方法按照指定的列或所有列进行分组;
  2. 使用agg方法和first函数选择每个分组中的第一条记录作为代表;
  3. 将代表记录保留下来,删除所有重复记录,返回一个新的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");
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值