hive相关知识整理
- 无事事实表 就是指没有指标度量值的事实表,有多个维度外键,一般用来业务维度的关联。
- grouping sets函数
(1)功能:根据给定的不同维度进行分组聚合,结果相当于挨个分组聚合然后union合并
(2)语法:grouping sets(维度1,维度2,维度3……);
(3)特点:语法简单,性能更好,只对表进行一次查询
(4)场景:需要基于多种组合维度进行分析同样的指标放入一张结果表的时候 - grouping函数
(1)功能:通过grouping来判断是否基于当前维度【列】实现了分组,实现过滤和判断
(2)语法:grouping (维度1,维度2,维度3……);
如果基于这个维度会返回0否则1
如果有多个维度的话会返回二进制
比如三个维度都不基于会返回 111 的十进制 7 - row_number函数
(1)功能:实现计算去重
如果按分区的字段为重复的会自动加一行row_number显示1、2、3……
(2)语法:row_number() over(partition by 字段,字段……);
例如:
伪代码:
| name | id | birthday | degree | row_number |row_number() over(partition by name,id,birthday,degree);
| 张三 | 1001 | 2007-05-18 | 98 | 1 |
| 张三 | 1001 | 2007-05-18 | 98 | 2 |
| 张三 | 1001 | 2007-05-18 | 98 | 3 |
row_number的值会自动加一
所以可以用row_number做计算去重只取row_number为1的 - hive的优化:
(1)属性优化:
①关联优化
②小文件处理:合并小文件
③ 索引优化
④谓词下推:先过滤在处理
⑤sql优化(核心)
⑥设计优化:分桶表、分区表、文件存储类型 orc
(2)数据倾斜
①使用分桶表
②开启map端聚合(规约) 减少进入reduce的个数
③开启参数hive.groupby.skewindata=true实现随机分区
④sql指定随机分区distribute by rand():将数据写入随机的分区中
⑤将大表转化为小表,避免走reduce join 尽量走 map join