1、使用distinct去重

distinct用来查询不重复记录的条数,用count(distinct id)来返回不重复字段的条数。用法注意:

  • distinct【查询字段】,必须放在要查询字段的开头,即放在第一个参数;
  • 只能在SELECT 语句中使用,不能在 INSERT, DELETE, UPDATE 中使用;
  • DISTINCT 表示对后面的所有参数的拼接取不重复的记录,即查出的参数拼接每行记录都是唯一的
  • 不能与all同时使用,默认情况下,查询时返回的就是所有的结果。

distinct支持单列、多列的去重方式。

  • 作用于单列

    • 单列去重的方式简明易懂,即相同值只保留1个。

      select distinct name from A    //对A表的name去重然后显示
      
  • 作用于多列

    • 多列的去重则是根据指定的去重的列信息来进行,即只有所有指定的列信息都相同,才会被认为是重复的信息。
    • 注意,distinct作用于多列的时候只在开头加上即可,并不用每个字段都加上。distinct必须在开头,在中间是不可以的,会报错,`select id,distinct name from A //错误
      select distinct id,name from A   //对A表的id和name去重然后显示
      
  • 配合count使用

    select count(distinct name) from A  //对A表的不同的name进行计数
    
  • 按顺序去重时,order by 的列必须出现在 distinct 中

    • 出错代码

    • 改正后的代码

    • 讨论:若不使用Distinct关键字,则order by后面的字段不一定要放在seletc中

MySQL中使用去重distinct方法的示例详解
【Hive】数据去重


2、使用group by

GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数,形式为select 重复的字段名 from 表名 group by 重复的字段名;

  • group by 对age查询结果进行了分组,自动将重复的项归结为一组。
  • 还可以使用count函数,统计重复的数据有多少个

3、使用ROW_NUMBER() OVERGROUP BY 和 COLLECT_SET/COLLECT_LIST

说到要去重,自然会想到 DISTINCT,但是在 Hive SQL 里,它有两个问题:

  • DISTINCT 会以 SELECT 出的全部列作为 key 进行去重。也就是说,只要有一列的数据不同,DISTINCT 就认为是不同数据而保留。
  • DISTINCT 会将全部数据打到一个 reducer 上执行,造成严重的数据倾斜,耗时巨大。

2.1 ROW_NUMBER() OVER

DISTINCT 的两个问题,用 ROW_NUMBER() OVER 可解。比如,如果我们要按 key1 和 key2 两列为 key 去重,就会写出这样的代码:

WITH temp_table AS (SELECTkey1,key2,[columns]...,ROW_NUMBER() OVER (PARTITION BY key1, key2ORDER BY column ASC) AS rnFROMtable
)SELECTkey1,key2,[columns]...
FROMtemp_table
WHERErn = 1;

这样,Hive 会按 key1 和 key2 为 key,将数据打到不同的 mapper 上,然后对 key1 和 key2 都相同的一组数据,按 column 升序排列,并最终在每组中保留排列后的第一条数据。借此就完成了按 key1 和 key2 两列为 key 的去重任务。注意 PARTITION BY 在此起到的作用:

  • 一是按 key1 和 key2 打散数据,解决上述问题 (2);
  • 二是与 ORDER BY 和 rn = 1 的条件结合,按 key1 和 key2 对数据进行分组去重,解决上述问题 (1)。

但显然,这样做十分不优雅(not-elegant),并且不难想见其效率比较低。

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) as num 表示根据 COL1分组,在分组内部根据 COL2排序,此函数计算的值num就表示每组内部排序后的顺序编号(组内连续的唯一的)

2.2 GROUP BY 和 COLLECT_SET/COLLECT_LIST

ROW_NUMBER() OVER 解法的一个核心是利用 PARTITION BY 对数据按 key 分组,同样的功能用 GROUP BY 也可以实现。但是,GROUP BY 需要与聚合函数搭配使用。我们需要考虑,什么样的聚合函数能实现或者间接实现这样的功能呢?不难想到有 COLLECT_SET 和 COLLECT_LIST。

SELECTkey1,key2,[COLLECT_LIST(column)[1] AS column]...
FROMtemp_table
GROUP BYkey1, key2

对于 key1 和 key2 以外的列,我们用 COLLECT_LIST 将他们收集起来,然后输出第一个收集进来的结果。这里使用 COLLECT_LIST 而非 COLLECT_SET 的原因在于 SET 内是无序的,因此你无法保证输出的 columns 都来自同一条数据。若对于此没有要求或限制,则可以使用 COLLECT_SET,它会更节省资源。

相比前一种办法,由于省略了排序和(可能的)落盘动作,所以效率会高不少。但是因为(可能)不落盘,所以 COLLECT_LIST 中的数据都会缓存在内存当中。如果重复数量特别大,这种方法可能会触发 OOM。此时应考虑将数据进一步打散,然后再合并;或者干脆换用前一种办法。

删除 Hive SQL 查询结果中的重复内容


数据库之MySQL查询去重数据

SQL:数据去重的三种方法相关推荐

  1. SQL 中去重的三种方法

    点击关注上方"逆锋起笔", 设为"置顶或星标",第一时间送达干货 blog.csdn.net/xienan_ds_zj/article/details/1038 ...

  2. SQL中去重的三种方法,还有谁不会?

    来自:CSDN,作者:米竹 链接:https://blog.csdn.net/xienan_ds_zj/article/details/103869048 SQL去重是数据分析工作中比较常见的一个场景 ...

  3. SQL去重的三种方法汇总

    SQL去重的三种方法汇总 这里的去重是指:查询的时候, 不显示重复,并不是删除表中的重复项 1.distinct去重 注意的点:distinct 只能一列去重,当distinct后跟大于1个参数时,他 ...

  4. 使用SQL查询数据库中重复的数据的的三种方法

    第一种方法 select username count(*) u from user_info group by username having u>1 第二种方法 select usernam ...

  5. Python——数据存储的三种方法

    一.CSV文件 1.导入 由于是python自带的库,无需安装就可以使用,只要使用下面命令就可以导入 import csv 2 .使用方法 2.1 从csv文件读入数据 import csv #使用o ...

  6. java数据输入的步骤_Java学习日志1.4 Scanner 数据输入的三种方法

    Scanner sc = new Scanner(System.in); /注意in 是InputStream的缩写,是字节输入流的意思. 整句话的含义就是: new 一个对象,接受从键盘输入的数据, ...

  7. python教程怎么抓起数据_介绍python 数据抓取三种方法

    三种数据抓取的方法正则表达式(re库) BeautifulSoup(bs4) lxml *利用之前构建的下载网页函数,获取目标网页的html,我们以https://guojiadiqu.bmcx.co ...

  8. 抓取微信小程序数据包的三种方法

    前言 做安全测试的都会遇到测试某微信小程序,而微信小程序基本都是基于HTTPS的,所以抓取HTTPS数据包就是最关键的一步.最近几天折腾了一下,整理了比较简单.方便的三种方法. 条件 抓取微信小程序数 ...

  9. es6数组去重的三种方法

    1.es6的三种方法 let arr = [2, 5, 3, 3, 5, 7, 3, 7, 3, 7, 2, 2]// (1)拓展运算符 + new Set 方法let narr1 = [...new ...

最新文章

  1. pd.dataframe.append
  2. 如何在Git中克隆所有远程分支?
  3. 只需三分钟!教会你如何选购及维护UPS蓄电池?
  4. 大型网站技术架构 读书笔记
  5. Android system server之WindowManagerService按键消息传播流程
  6. 全球及中国印刷行业发展形势与十四五应用前景分析报告2022版
  7. 第五届河南省大学生程序设计竞赛 题解
  8. C语身教程第三章: C说话挨次筹算匹面(1)
  9. 和大家探讨一下“虚拟光驱”原理
  10. 分数求和(信息学奥赛一本通-T1209)
  11. HTTP 1.1状态代码
  12. 利用Quartz2D--context绘制矩形
  13. C/C++中深浅拷贝(map、vector)与内存释放
  14. Zepto.js 使用手册
  15. 中文分词技术(中文分词原理)
  16. Laravel 生成QRCODE
  17. 小米、百度、bigo 、滴滴 、快手等iOS 面试后的一次阶段性总结
  18. 服务端渲染和客户端渲染
  19. 微信小程序如何获取高清用户头像
  20. Java基础篇——选择结构

热门文章

  1. 计算机组成原理流水线ppt,[计算机组成原理第讲流水线.ppt
  2. 数据结构思维导图,超全!超详细!
  3. 原型工具axure7.0 正式版免费下载
  4. 进制转换----二进制转十进制
  5. 第一人称游戏与第三人称游戏的区别
  6. 引导滤波(guidedFilter)与边窗盒式滤波(sideWindowBoxFilter)的C++与OpenCV实现
  7. 詳解 Router 路由器
  8. LeetCode 222. Count Complete Tree Nodes 题解——Java
  9. Java 8 辣么大(lambda)表达式不慌之—–(四)示例-Collectors中的中的joining 方法和mapping方法
  10. js---函数基础练习题