首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Hive Count Distinct优化

日常统计场景中,我们经常会对一段时期内的字段进行去重并统计数量,SQL语句类似于 SELECT COUNT( DISTINCT id ) FROM TABLE_NAME WHERE ...; 这条语句是从一个表的符合...原来Hive在处理COUNT这种全聚合(full aggregates)计算时,会忽略用户指定的Reduce Task数,而强制使用1。我们只能采用变通的方法来绕过这一限制。...在第二阶段,由于id已经去重,因此 COUNT(*) 操作在Map阶段不需要输出原id数据,只输出一个合并后的计数即可。...改进后的SQL语句如下: SELECT COUNT(*) FROM ( SELECT DISTINCT id FROM TABLE_NAME WHERE … ) t; 在实际运行时,我们发现...它将第二个MapReduce作业Map中的Count过程移到了第一个作业的Reduce阶段。这样在第一阶段Reduce就可以输出计数值,而不是去重的全部id。

3.4K31
您找到你想要的搜索结果了吗?
是的
没有找到

count(distinct) 玩出了新花样

概述 如果 count(distinct) 不能使用索引去重,就需要使用临时表。临时表的存储引擎有三种选择:MEMORY、MyISAM、InnoDB。...以后,用 explain 查看执行计划时,如果发现 count(distinct) 既没有使用索引,也没有使用临时表,那你可能就会想到:这家伙大概是悄无声息的使用了红黑树。...如果红黑树占用内存达到最大值,所有结点数据(包含元数据)会被写入磁盘文件,然后删除红黑树所有结点,保留内存以便重复使用。...③ 判断当前的最小记录,是否和上一次最小的记录相同,如果相同,说明重复,处理;如果不同,进行计数。 循环执行第 ① ~ ③ 步,直到读完当前分组所有数据块中的记录,合并完成。...第 6 步,分组计数。 红黑树所有结点都在内存中,红黑树中的结点数量就是 count(distinct) 函数的结果。这个步骤处理完,流程结束。 第 7 步,多个数据块合并去重,然后分组计数

1.5K20

再来说说sparksql中count(distinct)原理和优化手段吧~

本来以为count(distinct)是老知识点了,之前有总结过相关的内容: sparksql源码系列 | 一文搞懂with one count distinct 执行原理 spark sql多维分析优化...我们知道sparksql处理count(distinct)时,分两种情况: with one count distinct more than one count distinct 这两种情况,sparksql...处理的过程是不相同的 其中【with one count distinct】在sparksql源码系列 | 一文搞懂with one count distinct 执行原理 一文中详细介绍过啦,这篇主要分析一下...如果sql中没有非distinct类的聚合,比如,sql是: select count(distinct a) as a_num, count(distinct b) as b_num...(distinct if(b=1,a,null)) as a_num1, count(distinct if(b=3,a,null)) as a_num2 , count(distinct if(b

81910

sparksql源码系列 | 一文搞懂with one count distinct 执行原理

在面试时,或多或少会被问到有关count distinct的优化,现在离线任务用到的基本就是hivesql和sparksql,那sparksql中有关count distinct做了哪些优化呢?...实际上sparksql中count distinct执行原理可以从两个点来说明: with one count distinct more than one count distinct 这篇文章主要聊一聊...物理执行计划的几个阶段3、除了count distinct,没有其他非distinct聚合函数的情况的执行原理4、除了count distinct,有其他非distinct聚合函数的情况的执行原理5、关键点调试...先group by,再count Sparksql with one count(distinct) 的情况,相比于hive来说,做了优化 select a,count(distinct b) from...by a HashAggregate(keys=[a#3], functions=[count(distinct b#4)], output=[a#3, count(DISTINCT b)#11L]

97710

从Approx_Count_Distinct到M7的CPU集成

昨天和朋友交流,联想起Oracle的两个特性,approx_count_distinct 和 SQL in Silicon,从软件到硬件,从典型SQL入手的优化,Oracle一步一步走向细节和性能的极致...在Oracle 12c中,有一个新的函数被引入进来 - approx_count_distinct 。这个函数的作用是,当我们进行Count Distinct计算时,给出一个近似值。...在很多系统中,COUNT DISTINCT是个常见的操作,如果使用这个函数,则可能带来很好的性能改善。 以下是我非常简单的一个测试,可以看到基本的效果: ?...approx_count_distinct在大数据量下的表现会非常好,资源使用非常低,极其稳定。...count(*) 和 count distinct 都是非常常见的操作,也很消耗资源。从常见、常用的SQL入手,Oracle的一点点改进都会给用户带来帮助,在细节上的优化Oracle做到极致了。

83750

Oracle 12c新特性之:APPROX_COUNT_DISTINCT 函数

在Oracle 11g中,已经添加APPROX_COUNT_DISTINCT函数,但相关文档中没有体现,用于提高使用DBMS_STATS包收集统计信息时计算不同值(NDV)数量的速度。...Oracle数据库12c(12.1.0.2)中,文档中已经包含了此函数,因此我们可以在应用程序中将其作为支持的SQL函数使用。...基本用法 性能 基本用法 在以前的数据库版本中,如果我们想要执行不同值的计数,我们可能会做如下。...SELECT COUNT(DISTINCT object_name) AS obj_count FROM all_objects; OBJ_COUNT ---------- 47171...SQL> 此查询为我们提供了基于Oracle的读一致性模型的不同值的确切计数。 因此,我们可以看到所有提交的数据,以及当前会话提交的任何未提交的更改。

39130

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券