注:该Hive语法仍可以做很多优化:建立临时表一次性从大表中取出数据;把where条件尽量放在一次判断中,这里仅针对distinct和group by讨论。
#结论:
针对大量数据的去重,group by的效率要远高于distinct。
#从distinct转化为group by
简单的转化这里不提,针对:一条语句里求 总记录条数 以及 去重之后的记录条数
简单示例:
这里写图片描述

SELECT
COUNT(*) AS sum_cnt
,COUNT(DISTINCT age ) AS user_cnt
liu_t_02 t
GROUP BY 
t.name;

转化为group by 只需要在加一个group by,并采用sum和count的组合

SELECT
SUM(age),
COUNT(tt.age)
SELECT t.name0 AS name0,COUNT(age) as age
liu_t_02 t
GROUP BY 
t.name0,t.age
GROUP BY tt.name0

#测试时间对比
自己写的用于计算巨量数据的distinct的脚本,在shell中用时13分钟
修改为group by,运算结果相同,用时9分钟,效率提升30%。

group by 优化 set hive.map.aggr = true; //是否在 Map 端进行聚合,默认为 True ;该设置会消耗更多的内存。 set hive.groupby.mapaggr.checkinterval = 100000000; //在 Map 端进行聚合操作的条目数目 set hive.groupby.skewindata = true; //解决数据倾斜的万能钥匙 当map阶段运行不了的时候,可以设置 set hive.map.aggr = false; 设置hive.map.aggr=true,提高HiveQL聚合的执行性能。 set hive.ma
执行计划: # distinct Stage-Stage-1: Map: 396 Reduce: 1 Cumulative CPU: 7915.67 sec HDFS Read: 119072894175 HDFS Write: 10 SUCCESS # group by Stage-Stage-1: Map: 396 Reduce: 457 Cumulative CPU: 1
一、distinct,group by与ROW_Number()窗口函数使用方法 1. Distinct用法:对select 后面所有字段去重,并不能只对一列去重。 (1)当distinct应用到多个字段的时候,distinct必须放在开头,其应用的范围是其后面的所有字段,而不只是紧挨着它的一个字段,而且distinct只能放到所有字段的前面 (2)distinct对NULL是不进...
当多个 distinct 操作同时出现在 select ,数据会分发多次。容易造成Reduce数据倾斜 1、如果不要求精确值,可以使用 spark-sql approx_count_distinct函数 (基数计数 hyperloglog) 2、修改SQL 基础数据准备如下, 需要计算 不同渠道下的 不同周期 的访问uv presto:bi> desc tmp.multi_distinct_test; Column | Type | Extra | Comment ---------+---------+-------+---------- user_id | bi [WITH CommonTable[removed], CommonTableExpression)*] Only available starting with Hive 0.13.0) SELECT [ALL | DISTINCT] select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BY col_list] [ORDER BY col_list] [CLUSTER BY col_list | [DISTRIBUTE BY col_list]
1.1.1什么是HiveHive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。1.1.2为什么使用Hive1.)直接使用hadoop所面临的问题人员学习成本太高项目周期要求太短MapReduce实现复杂查询逻辑开发难度太大2.)操作接口采用类SQL语法,提供快速开发的能力。避免了去写MapReduce,减少开发人员的学习成本。扩展功能很方便。1.1.3Hive的特点1.)可扩展Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。2.)延展性Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。3.)容错良好的容错性
HiveDISTINCTGROUP BY都可以用于去重,但它们的执行方式和效率略有不同。 DISTINCT操作会将所有数据都读入内存进行去重,因此适用于数据量不大的情况。它的效率较高,但会占用较多的内存资源。如果数据量很大,可能导致内存溢出。 GROUP BY操作则是在MapReduce的过程对数据进行分组,然后对每组进行操作,因此适用于大规模数据的去重。它的效率相对较低,但可以处理大量的数据,不会导致内存溢出。 因此,如果数据量较小,可以优先考虑使用DISTINCT操作;如果数据量较大,则需要使用GROUP BY操作。同时,还要根据具体情况进行优化,如使用索引等方式提高效率