1、介绍
分桶表特点: 会产生分桶文件。
效率上注意: 查询数据的时候如果使用了分桶字段那么会提升数据查询效率(数据过滤where、join、分组、抽样查询);否则会进行全表扫描
分桶与分区的区别:
1- 分桶字段必须是原有的字段名称
2- 分桶产生的是多个文件;而分区产生的是多级目录
3- 分区和分桶可以同时用在同一张表中。但是只能先分区,再分桶;不能先分桶再分区,因为我们不能在文件中在去建立文件夹
2、重要参数
-- 默认开启,hive2.x版本已经被移除 set hive.enforce.bucketing; -- 查看未定义因为已经被移除 set hive.enforce.bucketing=true; -- 修改 -- 查看reduce数量 -- 参数优先级: set方式 > hive文档 > hadoop文档 set mapreduce.job.reduces; -- 查看默认-1,代表自动根据桶数量匹配reduce数量 set mapreduce.job.reduces=3; -- 设置参数 注意: 如果在SQL文件中设置的参数,那么只针对该会话(session)中的后续执行的SQL语句有效。其他会话中的SQL语句无效。
补充:
如何修改Hive中中文乱码的问题?
解决hive的表字段comment中文乱码问题 - 知乎
3、基础分桶表
语法: create [external] table [if not exists] 分桶表名称(字段名称1 数据类型,字段名称2 数据类型.... )clustered by (分桶字段名称1,分桶字段名称2...) into 桶的数量 buckets;
示例:
create database day07; use day07; -- 创建分桶表 create table course_bucket_tb(cid int,cname string,sname string )clustered by (cid) into 3 buckets row format delimited fields terminated by '\t'; -- load方式将数据加载到Hive分桶表中 load data inpath '/dir/course.txt' into table course_bucket_tb; -- 查询数据 select * from course_bucket_tb;
4、分桶表排序
创建基础分桶表,然后桶内排序。语法: create [external] table [if not exists] 分桶表名称(字段名称1 数据类型,字段名称2 数据类型.... ) clustered by (分桶字段名称1,分桶字段名称2...) sorted by (排序字段名称1,排序字段名称2...) into 桶的数量 buckets; 注意:1- 不管是clustered by还是sorted by这些字段,都只能去建表语句中选择已有的字段2- sorted by中可以按照字段进行升序(asc ascend)或者降序(desc descend)。默认是升序。3- clustered by中的字段与sorted by中的字段可以不一样
示例:
use day07; -- 创建分桶表并且排序 create external table course_bucket_tb_sort(cid int,cname string,sname string )clustered by (cid) -- 按照cid进行分桶sorted by (cid desc) -- 按照cid进行降序排序into 3 buckets -- 将数据分到3个桶里面去。也就是在HDFS上会创建3个文件 row format delimited fields terminated by '\t'; -- 加载数据 load data inpath '/dir/course.txt' into table course_bucket_tb_sort; -- 验证数据 select * from course_bucket_tb_sort;
5、分桶原理
分桶原理1.1- 如果分桶的字段是数值类型,那么直接使用字段字段与桶的数量进行取模运算,得到要放到哪个桶里面去。1.2- 如果分桶的字段是字符串类型,那么先将字段值计算出一个Hash哈希值(是一个整数),然后拿着这个Hash值与桶的数量进行取模运算,得到要放到哪个桶里面去。取模解释: 也就是取余数。10%3=1 补充: 针对同一个内容,不管计算Hash值多少次,结果都是一样。例如下面world
6、分区表和分桶表区别
1- 分区表创建表的时候使用关键字: partitioned by (字段名称 字段类型)分区字段名注意事项: 分区字段不能在建表语句中存在分区表好处: 数据查询的时候使用分区字段能够提升数据分析速度,也就是减少了数据扫描分区表最直接的效果: 在HDFS下以分区字段和分区值创建了多级目录不建议直接上传文件在hdfs表根路径下: 分区表直接不能自动识别HDFS上目录变化,分区信息必须要在MySQL元数据中存在,也就是需要单独使用msck repair修复语句进行修复使用load方式加载hdfs中文件: 本质是移动文件到对应分区目录下 2- 分桶表创建表的时候使用关键字: clustered by (分桶字段名) sorted by (排序字段) into 桶的数量 buckets分桶字段名注意事项: 字段只能从建表语句中存在的字段进行挑选分桶表好处: 使用分桶字段进行数据查询,例如:过滤、join、抽样查询等能够提升效率分桶表最直接的效果: 在HDFS下创建分桶文件不建议直接上传文件在hdfs表根路径下: 分桶表可以识别对应的文件中数据,但是并没有分桶的效果,不推荐使用使用load方式加载hdfs中文件: 本质是复制文件内容到分桶文件中