HISTOGRAM
简介
HISTOGRAM
HISTOGRAM
函数统计表达式中每个值出现的次数,返回一个
MAP<STRING, STRING>
MAP<STRING, STRING>
,key 是值的字符串形式,value 是该值出现的次数(也是字符串类型)。适合快速了解某列的值分布、找出高频值。
语法
HISTOGRAM(expr)
参数
expr
expr
:任意类型的表达式,通常为列名。NULL
NULL
值不计入结果。
返回结果
- 返回值类型为
MAP<STRING, STRING>
MAP<STRING, STRING>
。
- key 是每个不同值转为字符串后的形式,value 是该值出现的次数(字符串类型,如
"2"
"2"
而非 2
2
)。
NULL
NULL
值被忽略,不出现在结果 map 中。
⚠️ 注意:返回的 count(value)是字符串类型,不能直接做数值比较或排序,使用前需用
CAST(value AS BIGINT)
CAST(value AS BIGINT)
转换。
示例
基础用法:统计值分布
SELECT HISTOGRAM(v)
FROM (VALUES (1),(2),(2),(3)) t(v);
+---------------------------+
| histogram(v) |
+---------------------------+
| {"1":"1","2":"2","3":"1"} |
+---------------------------+
结合 GROUP BY:按分组统计值分布
SELECT dept, HISTOGRAM(level)
FROM (VALUES
('eng', 'junior'),
('eng', 'senior'),
('eng', 'senior'),
('sales', 'junior'),
('sales', 'junior')
) t(dept, level)
GROUP BY dept;
+-------+------------------------------------+
| dept | histogram(level) |
+-------+------------------------------------+
| eng | {"junior":"1","senior":"2"} |
| sales | {"junior":"2"} |
+-------+------------------------------------+
使用 MAP_KEYS / MAP_VALUES 访问结果
MAP_KEYS
MAP_KEYS
返回所有出现的值,
MAP_VALUES
MAP_VALUES
返回对应的计数(字符串),可配合
CAST
CAST
转为数值做进一步计算:
SELECT
MAP_KEYS(HISTOGRAM(v)) AS values,
MAP_VALUES(HISTOGRAM(v)) AS counts
FROM (VALUES (1),(2),(2),(3)) t(v);
+-----------+-----------+
| values | counts |
+-----------+-----------+
| [1, 2, 3] | [1, 2, 1] |
+-----------+-----------+
⚠️ 注意:
MAP_VALUES
MAP_VALUES
返回的列表元素仍为字符串,如需排序或比较,需对每个元素单独
CAST
CAST
。
注意事项
- 返回类型是
MAP<STRING, STRING>
MAP<STRING, STRING>
,value 为字符串形式的计数,数值运算前须 CAST
CAST
。
NULL
NULL
值不计入统计,也不出现在结果 map 的 key 中。
- 结果 map 中 key 的顺序不保证,不同执行结果顺序可能不同。
- 不支持
DISTINCT
DISTINCT
,因为函数本身已对每个不同值单独计数。
相关文档