Hive 内部表和外部表的区别
- 外部表在创建时需要加关键字 external;
- 创建内部表时,会将数据移动到数据仓库指定的路径;
- 创建外部表时,不会移动数据,只会记录数据所在的路径;
- 删除内部表时,会删除元数据和数据本身;
- 删除外部表时,仅仅删除元数据,不会删除数据本身;
Hive cluster by、sort by、distribute by、order by 的区别
- order by :全局排序,只有一个 reduce ,数据量很大时会比较慢;
- sort by :局部排序,只保证每个 reduce 中的数据有序,不能保证全局有序;
- distribute by :控制 map 结果分发,相同值会被分发到同一个 map ;
- cluster by :根据指定字段将数据分组,每组内再根据该字段正序排序(只能正序),cluster by = distribute by + sort by;
Hive 分区和分桶的区别
- 分区是将 Hive 表数据分离为多个目录;
- 分桶是将对应的数据文件分解为若干个部分;
- 分区的字段必须是表中没有的字段;
- 分桶的字段必须是表中已经存在的字段;
Hive Union 和 Union all 的区别
- union :将多个结果合并为一个,对结果去重并排序;
- union all :将多个结果合并为一个,不对结果去重不排序;
Hive join 的原理
在 Map 阶段将 on 的字段设为 key ,然后将选择的字段作为 value 在 Reduce 阶段,相同 key 值的数据分发到同一个 Reducer;
Hive 如何优化 join 操作
- 若有大量 null key ,则先过滤或者随机赋值;
- 所是大小表 join ,可使用 MapJoin ;
- 若两张大表 join,可将倾斜的 key 过滤出来单独 join,则会分不到多个 task 进行 join 操作,最后在进行 union 操作;
Hive 的三种自定义函数及区别
- UDF :用户自定义函数,一对一输出,例如 round;
- UDTF :用户自定义表生产函数,一对多输出,例如 explode;
- UDAF :用户自定义聚合函数,多对一输出,例如count,sum 等;
Hive 数据倾斜
什么是数据倾斜?
- 数据倾斜是指在分布式处理中,数据不均匀,有部分数据比较集中;
- 数据倾斜会使得在处理过程中,某个结点的处理效率过低,甚至造成内存溢出;
造成数据倾斜的原因
- 业务本身造成的;
- 建表时考虑不周,导致 key 分布不均匀;
- 某些 SQL 操作容易造成数据倾斜;
造成数据倾斜的主要操作
group by
维度过少,某些值比较大,分发到不同 Reduce 操作,造成某个 Reduce 数据倾斜;
join
某些 key 值比较多,或者 key 值存在大量 null ,join 后分发到某个 Reduce 的数据量过大;
数据倾斜的解决方法
group by 造成的数据倾斜
分组中有部分数据比较多,造成数据倾斜。这种情况可以通过调参解决:
bash
set hive.map.aggr=true;
set hive.groupby.skewindata=true;
- hive.map.aggr=true 表示开启 map 端聚合;
- hive.groupby.skewindata=true 表示有数据倾斜时进行负载均衡,这会使得生成两个 MR job,第一个 job 会将数据随机分发到不同的 Reduce 进行聚合,可以达到负载均衡的效果;结果传入第二个 MR job ,根据预处理的数据结果按照 group by key 进行分发处理,包获赠相同的 key 分到同一个 Reduce 中,完成聚合;
join 造成的数据倾斜
有大量 null 值 join 的情况
- 数据中有大量 null 值,可以过滤掉;
- 使用随机值赋值;
大小表 join 的情况
- 可以使用 map join 将小表加载到内存中,并在 map 阶段完成 join 操作;
例如:
sql
select /*+MAPJOIN(b)*/ a.a1,a.a2,b.b2 from tablea a JOIN tableb b ON a.a1=b.b1 --其中b 为小表
key 值倾斜的情况
可以将倾斜的 key 过滤出来单独 join ,则会分散到多个 task 进行 join' 操作,最后再进行 union 即可;