5. Hive的三种去重方法

这篇具有很好参考价值的文章主要介绍了5. Hive的三种去重方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Hive的三种去重方法

1. distinct
-- 语法

SELECT DISTINCT column1, column2, ...
FROM table_name;

注意事项:

  • distinct 不能单独用于指定某一列,必须放在 select 中所有字段的最前面,否则会报错

    select column1, distinct column2, column3 
    from table_name;
    
    -- 报错信息
    
    类似于 "cannot recognize input near 'DISTINCT' 'column2' 'column3'" 的语法错误
    
  • distinct 是对 select 后面所有字段的组合进行去重,并不是只对紧跟其后的 column1 去重。distinct 的作用范围是整个 SELECT 子句的结果集

  • distinct 对 NULL 是不进行过滤的,即返回的结果中包含NULL值

    with t1 as (
        select 'a' as name
        union all
        select 'b' as name
        union all
        select NULL as name
        union all
        select NULL as name
    )
    
    select distinct name
    from t1;
    
    -- output:
    
    b
    NULL
    a
    
  • 当对大数据集进行去重时,使用 DISTINCT 需要考虑性能影响(效率较慢)

2. group by
-- 语法

SELECT column1, column2, aggregate_function(column3)
FROM table_name
WHERE condition
GROUP BY column1, column2

注意事项:

  • distinct 与 group by 的关系?

    SELECT DISTINCT colA, colB 
    FROM table1;
    
    -- 等价于
    
    SELECT colA, colB 
    FROM table1
    GROUP BY colA, colB;
    
  • 在实现去重时,group by 是对 group by 后面所有字段的组合进行去重,并不是只对紧跟其后的 colA 去重。

3. row_number()
-- 语法

SELECT column1, column2, ..., ROW_NUMBER() OVER (PARTITION BY column1 ORDER BY column2) as row_num
FROM table_name
WHERE condition;

使用 row_number() 实现去重操作

-- 对 column1 进行去重

SELECT column1
FROM (
  SELECT column1 ROW_NUMBER() OVER (PARTITION BY column1) as row_num
  FROM table_name
) t
WHERE row_num = 1;

-- 对 column1、column2 进行去重

SELECT column1,column2
FROM (
  SELECT column1,column2 ROW_NUMBER() OVER (PARTITION BY column1,column2) as row_num
  FROM table_name
) t
WHERE row_num = 1;
4. 三者的效率对比

在 Hive 中,使用 distinctgroup byrow_number() 实现去重时,它们的效率会受到多个因素的影响,包括数据规模、数据分布、查询条件等。

一般情况下,distinct 的效率相对较低,因为它需要对整个结果集进行扫描和比较,以去除重复行。尤其是当数据量较大时,distinct 可能会对性能产生较大的影响。因此,使用 distinct 去重时需要谨慎考虑其性能开销。

相比之下,group by 在处理去重时具有更好的性能group by 会先按照指定的列进行分组,然后在每个分组内进行聚合操作,这样可以减少比较的数据量。当数据量较大时,使用 group by 去重往往比 distinct 效率更高

row_number() 通常用于复杂的去重需求,它能够在查询结果中为每一行生成一个唯一的序号。 row_number() 可以实现更灵活的去重操作,效率相对较高

 

参考链接

Hive的三种去重方式对比

hive中三种去重的方法

Hive DISTINCT() for all columns?文章来源地址https://www.toymoban.com/news/detail-539587.html

到了这里,关于5. Hive的三种去重方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java8 列表通过 stream流 根据对象属性去重的三种实现方法

    0、User对象 1、使用filter进行去重 测试 ①、疑惑 既然 filter 里面调用的是 distinctPredicate 方法,而该方法每次都 new 一个新的 map 对象,那么 map 就是新的,怎么能做到可以过滤呢 ②、解惑 先看一下 filter 的部分实现逻辑,他使用了函数式接口 Predicate ,每次调用filter时,会使用

    2024年01月20日
    浏览(49)
  • Python 判断列表里是否有重复元素的三种方法

    一、用 set 方法去重后与原列表长度比较 二、用 append 的方式把原列表中的元素添加到一个新列表,确保新列表里不存在重复的元素,然后比较两个列表 三、用 fromkeys 的方法创建一个字典,因为字典的键会自动去重,所以可以比较字典和原列表的长度,跟方法一很像

    2024年02月11日
    浏览(41)
  • java删除文件或目录的三种方法

    传统删除是利用IO流,本文利用NIO流实现。 代码如下(示例): 代码如下(示例): 代码如下(示例): 利用NIO流的好处: 1.如果删除失败,可以给出错误的具体原因; 2.代码不多,效率高。

    2024年02月10日
    浏览(54)
  • hive删除表数据方法

    insert overwrite table test_table select * from test_table where 1=0; insert overwrite table是覆盖数据,后面select是指使用哪里的数据进行覆盖, 如果条件为空 where 1=0,那就代表清除数据。 仅仅删除表数据,保留表结构。 方法一 truncate用于删除所有的行且不能删除外部表,因为外部表里的数据

    2024年02月11日
    浏览(23)
  • JavaScript删除字符串最后一个字符的三种方法

    JavaScript删除字符串最后一个字符的三种方法 在JavaScript中,我们经常需要操作字符串。有时候,我们可能需要删除字符串的最后一个字符。下面将介绍三种常见的方法来实现这个目标。 方法一:使用 slice 函数 slice 函数是JavaScript中一个常用的字符串方法,它可以返回一个新的

    2024年02月08日
    浏览(42)
  • Hive实战:实现数据去重

    在本次实战任务中,我们利用Hive大数据处理框架对三个文本文件(ips01.txt、ips02.txt、ips03.txt)中的IP地址进行了整合与去重。首先,在虚拟机上创建了这三个文本文件,并将它们上传至HDFS的/deduplicate/input目录下作为原始数据源。接着,启动了Hive Metastore服务和客户端,以管理

    2024年01月16日
    浏览(20)
  • js之删除对象属性的三种方法 & 判断对象中是否有某一属性的四种方法

    js之删除对象属性的三种方法 判断对象中是否有某一属性的四种方法 示例 1、基础版 2、进阶版 1、删除一个对象上的属性 1.1、delete 语法 delete 对象.属性名 1.2、es6之解构赋值 1.3、es6之反射 语法 Reflect.deleteProperty(对象,属性名) 2、判断对象中是否有某一属性的四种方法 2.1、

    2024年02月13日
    浏览(37)
  • spark5种去重方式,快速去重

    sql中最简单的方式,当数据量小的时候性能还好.当数据量大的时候性能较差.因为distinct全局只有一个reduce任务来做去重操作,极容易发生数据倾斜的情况,整体运行效率较慢. 示例: (对uid去重) 双重group by将去重分成了两步,是分组聚合运算,group by操作能进行多个reduce任务并行处理

    2023年04月16日
    浏览(19)
  • (12)Hive调优——count distinct去重优化

       离线数仓开发过程中经常会对数据去重后聚合统计,count distinct使得map端无法预聚合,容易引发reduce端长尾,以下是count distinct去重调优的几种方式。 原sql 如下: 优化思路:group by两阶段聚合   解决方案一通 过两阶段group by(分组聚合)  对count (distinct) 进行改造调优,需要

    2024年02月22日
    浏览(32)
  • Oracle四种去重方式

    1.distinct去重 2.group by 去重 3.rowid(伪列去重)如果 step_id 也要要求去重就把条件加上去,如果不需要去重则不加 4.窗口函数row_number () over() 去重  如果 step_id 也要要求去重就把条件加上去,如果不需要去重则不加 row_number()  over(partition by SFC_NO order by CREATE_DATE desc) rn 为新增一

    2023年04月23日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包