为什么要分桶?
- 单个分区或者表中的数据量越来越大,当分区不能更细粒的划分数据时,所以会采用分桶技术将数据更细粒度的划分和管理。
- 通俗点来说就是分区是分文件夹,分桶是将文件夹下的文件分成几个文件块去存储。比如表文件中本来是1000000条数据,由于在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便,所以我们可以分多个文件去存储。
- 分桶更加细粒度的管理数据,更多的是使用来做抽样、join
1、分桶原理
- 分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储。
- 对于hive中每一个表、分区都可以进一步进行分桶。
- 由列的哈希值除以桶的个数来决定每条数据划分在哪个桶中。
- 适用场景: 数据抽样( sampling ) 与解决数据倾斜
2、分桶操作
注意:分区使用的是表外字段,分桶使用的是表内字段
1、开启hive的桶表功能
set hive.enforce.bucketing = true;
意思:得到bucket的个数和reduce个数是一致的,mr运行时会根据bucket的个数自动分配reduce task个数
2、创建桶表
create table tableName(字段名称 字段类型,字段名称 字段类型, ....)
clustered by(c_id) into n buckets
row format delimited fields terminated by ‘字段分割符’;
c_id
:分桶依据字段
n
:桶的个数
3、加载数据
- 注意事项:
桶表的数据加载,只能通过insert 插入。hdfs dfs -put文件或者通过load data无法加载。
所以只能先创建普通表也称为临时表,并通过insert overwrite的方式将普通表的数据通过查询的方式加载到桶表当中去
insert into table 表名 select * from 基础表名;
或
insert