Spark的几种去重的原理分析

简介: Spark的几种去重的原理分析

前言

我们经常做去重的操作,事实上几种方式可以实现去重,但是结果的理解其实是不一样的,不过在一定程度上这几种也都可以满足我们的需求。

参考数据

id name
1 a
2 b
1 a
1 b

Distinct去重

这个其实是真正的去重,语意上其实就是如果出现一样的结果,则就显示一行

可以作用单行或者多行

select distinct id from t;
id
1
2

或者是

select distinct id,name from t;

作用多行的时候多行要一起相等才行

id name
1 a
2 b
1 b

group by操作

实际上这个要求去重列作为聚合字段,我们一般可以做聚合去实现

select count(*) as cnt,id,name from t group by id,name;

当我们不关心聚合结果的时候得到的结果就是去重的结果了

row_number开窗操作

实际上我们要分开来看,首先是开窗之后的结果

select row_number() over (partition by id)  as rn ,id,name  from t
rn id name
1 1 a
2 1 b
3 1 b
1 2 b

这个操作会把相同的id增加一个序号列,我们一般是外面套一个过滤条件去筛选

select * from (
select row_number() over (partition by id)  as rn ,id,name  from t
) h where h.rn=1; 

这种做法实际上是在所有记录中取一条记录。

性能分析

事实上直接的distinct的话直接做一次reduceByKey就可以了,简单来说,这个在map端是可以优化

当然优化都是建立在数据量大的时候才有意义,当数据输出比较大的时候,map端可以多做一步

同样的道理,我们做group by其实也可以这样子做,这个技术其实是combine技术,减少网络传输

关键的前提是允许这么干才行,否则是拿不到要的结果的,row_number()的操作类似这样子的,需要提前编号,再进行过滤

从图中就可以发现,中间过程的要求,导致我们不能做一个map操作的优化,所以其实是会慢一些,但是row_number实际上会保留我们需要的那行数据本身,所以大部分情况是不能被group by替代的

总结

其实几种去重的方式本质上意义是不一样的,这也是满足不同的需求下的操作,表面上差不多,实际考虑实现的时候还是要多琢磨一下。

目录
相关文章
|
2月前
|
机器学习/深度学习 分布式计算 算法
Spark快速大数据分析PDF下载读书分享推荐
《Spark快速大数据分析》适合初学者,聚焦Spark实用技巧,同时深入核心概念。作者团队来自Databricks,书中详述Spark 3.0新特性,结合机器学习展示大数据分析。Spark是大数据分析的首选工具,本书助你驾驭这一利器。[PDF下载链接][1]。 ![Spark Book Cover][2] [1]: https://zhangfeidezhu.com/?p=345 [2]: https://i-blog.csdnimg.cn/direct/6b851489ad1944548602766ea9d62136.png#pic_center
114 1
Spark快速大数据分析PDF下载读书分享推荐
|
2月前
|
弹性计算 分布式计算 Serverless
全托管一站式大规模数据处理和分析Serverless平台 | EMR Serverless Spark 评测
【7月更文挑战第6天】全托管一站式大规模数据处理和分析Serverless平台 | EMR Serverless Spark 评测
23681 42
|
4月前
|
SQL 分布式计算 监控
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
本文演示了使用 EMR Serverless Spark 产品搭建一个日志分析应用的全流程,包括数据开发和生产调度以及交互式查询等场景。
56571 7
基于阿里云 EMR Serverless Spark 版快速搭建OSS日志分析应用
|
3月前
|
机器学习/深度学习 数据采集 分布式计算
基于spark的大数据分析预测地震受灾情况的系统设计
基于spark的大数据分析预测地震受灾情况的系统设计
|
4月前
|
SQL 分布式计算 关系型数据库
Spark 分析计算连续三周登录的用户数
本文介绍了如何使用窗口函数`range between`来查询`login_time`为2022-03-10的用户最近连续三周的登录数。首先在MySQL中创建`log_data`表并插入数据,接着定义需求为找出该日期前连续三周活跃的用户数。通过Spark SQL,分步骤实现:1)确定统计周期,2)筛选符合条件的数据,3)计算用户连续登录状态。在初始实现中出现错误,因未考虑日期在周中的位置,修正后正确计算出活跃用户数。
|
3月前
|
分布式计算 定位技术 Scala
使用spark基于出租车GPS数据实现车辆数量统计以及北京每个城区的车辆位置点数分析
使用spark基于出租车GPS数据实现车辆数量统计以及北京每个城区的车辆位置点数分析
|
4月前
|
SQL 存储 分布式计算
spark执行sql的原理是什么
spark执行sql的原理是什么
83 1
|
4月前
|
分布式计算 Java 关系型数据库
|
4月前
|
SQL 分布式计算 数据可视化
数据分享|Python、Spark SQL、MapReduce决策树、回归对车祸发生率影响因素可视化分析
数据分享|Python、Spark SQL、MapReduce决策树、回归对车祸发生率影响因素可视化分析
|
SQL 分布式计算 Java
五、【计算】Spark原理与实践(下) | 青训营笔记
五、【计算】Spark原理与实践(下) | 青训营笔记
五、【计算】Spark原理与实践(下) | 青训营笔记