Hive SQL 聚合统计函数 COUNT 类似于标准 SQL 的 COUNT 函数,用来计算符合条件的行数。
语法说明
语法
COUNT(*)
COUNT(expr)
COUNT(DISTINCT expr[, expr...])
说明
COUNT(*):统计总行数,包括含有 NULL 值的行;
COUNT(expr):统计提供非 NULL 的 expr 表达式值的行数;
COUNT(DISTINCT expr[, expr ...]):统计提供非 NULL 且去重后的 expr 表达式值的行数。
常用例子
COUNT 与 IF 结合计数
假设通过一个 sql 聚合不同时间段的统计数据,就有可能用到 IF 函数,设定表为 stat,其中分区字段为 dt 表示日期,字段 act 分别表示 1 为曝光行为,2 为点击行为,示例如下:
SELECT
item_id AS item_id,
COUNT(IF(act = 1 AND dt >= 20200929 AND dt <= 20201001, 1, NULL)) AS impression_3,
COUNT(IF(act = 2 AND dt >= 20200929 AND dt <= 20201001, 1, NULL)) AS click_3,
IF(COUNT(IF(act = 1 AND dt >= 20200929 AND dt <= 20201001, 1, NULL)) > 0, round(COUNT(IF(act = 2 AND dt >= 20200929 AND dt <= 20201001, 1, NULL)) / COUNT(IF(act = 1 AND dt >= 20200929 AND dt <= 20201001, 1, NULL)), 4), 0) AS ctr_3,
COUNT(IF(act = 1, 1, NULL)) AS impression_30,
COUNT(IF(act = 2, 1, NULL)) AS click_30,
IF(COUNT(IF(act = 1, 1, NULL)) > 0, round(COUNT(IF(act = 2, 1, NULL)) / COUNT(IF(act = 1, 1, NULL)), 4), 0) AS ctr_30,
FROM stat
WHERE dt >= 20200902
AND dt <= 20201001
GROUP BY item_id
如上 SQL 可以看出,一个 SQL 一次性地获取最近 3 天和 30 天的曝光(impression)、点击(click)和点击率(ctr)数据,利用 IF 多个条件划定时间范围。
COUNT(NULL) 函数
Hive SQL COUNT(NULL) 返回 0,可以利用该特性结合 IF 条件函数做复杂的统计任务。