Impala的count(distinct QUESTION_ID) 与ndv(QUESTION_ID)
在impala中,一个select执行多个count(distinct col)会报错,举例:
select C_DEPT2,
count(distinct QUESTION_BUSI_ID) as wo_num,
count(distinct CREATOR_ID) as creator_num
from pdm.kudu_q_basic
where substr(CREATE_DATE, 1, 7) = '2020-10'
group by C_DEPT2
报错信息:
ERROR: AnalysisException: all DISTINCT aggregate functions need to have the same set of parameters as count(DISTINCT QUESTION_BUSI_ID); deviating function: count(DISTINCT CREATOR_ID)
Consider using NDV() instead of COUNT(DISTINCT) if estimated counts are acceptable. Enable the APPX_COUNT_DISTINCT query option to perform this rewrite automatically.
这时候,可通过以下方法解决:
1、得到的是近似值,数据量越大越不准确:
(1)SQL运行前,先运行命令:set APPX_COUNT_DISTINCT=true;
set APPX_COUNT_DISTINCT=true;
select C_DEPT2,
count(distinct QUESTION_BUSI_ID) as wo_num,
count(distinct CREATOR_ID) as creator_num
from pdm.kudu_q_basic
where substr(CREATE_DATE, 1, 7) = '2020-10'
group by C_DEPT2
order by C_DEPT2

(2)将count(distinct col)用函数ndv(col)代替
select C_DEPT2,
ndv(QUESTION_BUSI_ID) as wo_num,
ndv(CREATOR_ID) as creator_num
from pdm.kudu_q_basic
where substr(CREATE_DATE, 1, 7) = '2020-10'
group by C_DEPT2
order by C_DEPT2

需要注意的是,在set APPX_COUNT_DISTINCT=true;的情况下,使用count(distinct col)会自动转化成ndv(col),得到的是近似值,所以以上两种方法的结果数据一致。
2、精确值。拆分为子查询,再关联,如下:
set APPX_COUNT_DISTINCT = false; -- 将参数置为false,使用count(distinct col),确保不会转化成ndv(col)
select a.C_DEPT2, a.wo_num, b.creator_num
from (select C_DEPT2, count(distinct QUESTION_BUSI_ID) as wo_num
from pdm.kudu_q_basic
where substr(CREATE_DATE, 1, 7) = '2020-10'
group by C_DEPT2) a
left join (select C_DEPT2, count(distinct CREATOR_ID) as creator_num
from pdm.kudu_q_basic
where substr(CREATE_DATE, 1, 7) = '2020-10'
group by C_DEPT2) b on a.C_DEPT2 = b.C_DEPT2
order by a.C_DEPT2

验证:
select C_DEPT2, count(*)
from pdm.kudu_q_basic -- 表中无重复数据
where substr(CREATE_DATE, 1, 7) = '2020-10'
group by C_DEPT2
order by C_DEPT2

总结:解决在impala中一个select执行多个count(distinct col)报错问题,可以用过设置参数set APPX_COUNT_DISTINCT = true;或将count(distinct col)用ndv(col)解决,但得到的是近似值,不准确。还可以通过分别在子查询中进行count(distinct col)再关联得到准确值,但要注意参数 APPX_COUNT_DISTINCT = false,不然会自动转化为ndv(col)得到的还是近似值。
Impala的count(distinct QUESTION_ID) 与ndv(QUESTION_ID)的更多相关文章
- 关于MySQL count(distinct) 逻辑的一个bug【转】
本文来自:http://dinglin.iteye.com/blog/1976026#comments 背景 客户报告了一个count(distinct)语句返回结果错误,实际结果存在值,但是用cou ...
- 使用GROUP BY统计记录条数 COUNT(*) DISTINCT
例如这样一个表,我想统计email和passwords都不相同的记录的条数 CREATE TABLE IF NOT EXISTS `test_users` ( `email_id` ) unsigne ...
- COUNT(*),count(1),COUNT(ALL expression),COUNT(DISTINCT expression)
创建一个测试表 IF OBJECT_ID( 'dbo.T1' , 'U' )IS NOT NULL BEGIN DROP TABLE dbo.T1; END; GO )); GO INSERT INT ...
- SQL server 中 COUNT DISTINCT 函数
目的:统计去重后表中所有项总和. 直观想法: SELECT COUNT(DISTINCT *) FROM [tablename] 结果是:语法错误. 事实上,我们可以一同使用 DISTINCT 和 C ...
- pandas pivot_table或者groupby实现sql 中的count distinct 功能
pandas pivot_table或者groupby实现sql 中的count distinct 功能 import pandas as pd import numpy as np data = p ...
- COUNT DISTINCT ROW_NUMBER DENSE_RANK 以及对COUNT去重(非PARTITION)
1:COUNT DISTINCT SELECT COUNT(DISTINCT [QS_QuestionStem].Id) AS ReqCount1, ...
- count(distinct) 与group by 浅析
x在传统关系型数据库中,group by与count(distinct)都是很常见的操作.count(distinct colA)就是将colA中所有出现过的不同值取出来,相信只要接触过数据库的同学都 ...
- 使用子查询可提升 COUNT DISTINCT 速度 50 倍
注:这些技术是通用的,只不过我们选择使用Postgres的语法.使用独特的pgAdminIII生成解释图形. 很有用,但太慢 Count distinct是SQL分析时的祸根,因此它是我第一篇博客的不 ...
- 【hive】count() count(if) count(distinct if) sum(if)的区别
表名: user_active_day (用户日活表) 表内容: user_id(用户id) user_is_new(是否新用户 1:新增用户 0:老用户) location_city(用户所在地 ...
随机推荐
- MFC二进制文件读取
1.mfc Document-vew doc类中读取 doc类中读取,在Vew类中可直接使用. 在菜单栏NewFile/OpenFile 后,系统自动调用Serialize()函数 if :写入文件 ...
- Java lambda 分组后多列求和
主要思路是reducing,可以像sql一样分组后多列求和处理成新对象等: select code,max(name)as name,sum(chengJi)as chengJi,sum(age)as ...
- Java面试专题-基础篇(1)
- python将对象写入文件,以及从文件中读取对象
原文地址: http://www.voidcn.com/article/p-fqtqpwxp-wo.html 写入文件代码: >>> import sys, shelve >& ...
- Docker 跨平台在 netCore 中的从入门到部署
前言 从题目我们可以看的出,今天是五部曲的第三部,你可能会好奇,为啥没有见到前两部呢?这里我简单说下: 1.跨平台第一部曲:MySql 如果你看我的所有开源项目,应该能发现我已经全部迁移到了Mysql ...
- PyQt(Python+Qt)学习随笔:Qt Designer中toolBar的allowedAreas属性
1.概述 allowedAreas属性指定工具栏允许移动的范围,其类型为枚举类Qt.ToolBarAreas,有如下取值: 以上取值可以同or操作组合使用. 2.访问方法 缺省值为Qt.AllTool ...
- 跨国合作:Serverless Components 在腾讯云的落地和实践
导语 | Serverless Components 是 Serverless Framework 推出的最新解决⽅案,具有基础设施编排能⼒,开发者通过使⽤ Serverless Components ...
- .Net Core ABP应用如何在阿里云Linux Docker中开启Https
.Net Core应用开启Https本身就有很多种方式:1.代码配置2.环境变量3.反向代理 这里主要记录下阿里云的ECS,加阿里云免费的SSL证书,通过程序代码,如何进行配置. 首先从阿里云下载证书 ...
- 剑指offer二刷——数组专题——斐波那契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1). n<=39 我的想法 斐波那契数列定义:F(0)=0,F(1)=1, ...
- 通过CSS绘制五星红旗
任务要求: 1.创建一个div作为红旗旗面,用CSS控制其比例宽高比为3:2,背景为红色. 2.再创建五个小的div,用CSS控制其大小和位置. 3.用CSS同时控制每个小div的大小.边框和位置,同 ...