💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
聚合函数总是和`group by`分组语句共同使用, 过程就是先分组,然后使用聚合函数分别统计每个组内的信息。常见的聚合函数如:`avg(column)`、`count(column)`、`max(column)`、`min(column)`、`sum(column)`等。 <br/> **`group by`的特性:** (1)使用了 reduce 操作,受限于 reduce 数量,通过设置参数 `mapred.reduce.tasks `设置 reduce 个数。 (2)输出文件个数与 reduce 数量相同,输出的单个文件大小与 reduce 处理的数量有关。 <br/> **`group by`问题:** (1)网络负载过重。 (2)可能出现数据倾斜的情况(我们可以通过设置参数 `hive.groupby.skewindata`来优化数据倾斜的问题)。 <br/> `group by` 支持使用 `case when` 或表达式演示: ```sql 0: jdbc:hive2://hadoop101:10000> select * from score; +-------------+-------------+---------------+--+ | score.name | score.type | score.tscore | +-------------+-------------+---------------+--+ | 张三 | 语文 | 80 | | 张三 | 数学 | 98 | | 张三 | 英语 | 65 | | 李四 | 语文 | 70 | | 李四 | 数学 | 80 | | 李四 | 英语 | 90 | | 王五 | 语文 | 70 | | 王五 | 数学 | 80 | +-------------+-------------+---------------+--+ -- 求每一个人的语文、数学、英语成绩 select name, max(case type when '语文' then tscore else 0 end) Chinese, max(case type when '数学' then tscore else 0 end) Math, max(case type when '英语' then tscore else 0 end) English from score group by name; +-------+----------+-------+----------+--+ | name | chinese | math | english | +-------+----------+-------+----------+--+ | 张三 | 80 | 98 | 65 | | 李四 | 70 | 80 | 90 | | 王五 | 70 | 80 | 0 | +-------+----------+-------+----------+--+ -- 将数学划分理科,其余为文科,此时分别统计每一个人文科和理科的总分。 select name as `姓名`, case when type='数学' then '理科' else '文科' end as `科别`, sum(tscore) as `总分` from score group by name, case when type='数学' then '理科' else '文科' end; +-----+-----+------+--+ | 姓名 | 科别 | 总分 | +-----+-----+------+--+ | 李四 | 文科 | 160 | | 李四 | 理科 | 80 | | 王五 | 文科 | 70 | | 王五 | 理科 | 80 | | 张三 | 文科 | 145 | | 张三 | 理科 | 98 | +-----+-----+------+--+ ```