企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
**分桶表:** 作为分区表的一种优化手段,可以进一步提高查询效率和提供抽样效率。 **分区表:** 提供了一个隔离数据和优化查询的便利方式,不过并非所有的数据都可形成合理的分区,尤其是需要确定合适大小的分区划分方式(有的数据分区数据过大,有的很少,即我们常说的数据倾斜。 <br/> **分桶规则:** 按照分桶字段值的 hash 值除以分桶的个数进行取余 `$ bucketId=column.hashcode $` % `$ bucket.num $` 对数据进行分桶。 <br/> **开启Hive的分桶开关:** ```sql -- 在当前会话中设置 -- 分桶只有动态分桶,所以只能在当前会话中设置 0: jdbc:hive2://hadoop101:10000> set hive.enforce.bucketing=true; ``` 此开关打开之后,会自动根据 bucket 个数自动分配 Reduce task 的个数,Reduce 个数与 bucket 个数一致。 此外, Reduce 的个数还可以通过`mapred.reduce.tasks`进行设置,但是这方法不推荐在 Hive 分桶中使用。 ```sql 0: jdbc:hive2://hadoop101:10000> set mapred.reduce.tasks=4; ``` <br/> **创建分桶表:** * 分桶字段只能是建表中已有的字段; * 使用分桶拥有更高的查询处理效率; * 使用分桶使抽样更高效; * 分桶数最好是 `$ 2^n $`; * 分桶表只能是`insert`方式加载数据; (1) 示例数据 `peo_bucket.txt` ```xml -- 示例数据 peo_bucket.txt 10,ACCOUNTING,1700 20,RESEARCH,1800 30,SALES,1900 40,OPERATIONS,1700 ``` (2) 创建非分桶表,并加载数据 ```sql create table if not exists peo( id int, name string, age int ) row format delimited fields terminated by ','; load data local inpath "/hdatas/peo_bucket.txt" into table peo; 0: jdbc:hive2://hadoop101:10000> select * from peo; +---------+-------------+----------+--+ | peo.id | peo.name | peo.age | +---------+-------------+----------+--+ | 10 | ACCOUNTING | 1700 | | 20 | RESEARCH | 1800 | | 30 | SALES | 1900 | | 40 | OPERATIONS | 1700 | +---------+-------------+----------+--+ ``` (3) 创建分桶表并insert peo表的数据 ```sql create table bucket3 ( bid int, bname string, bage int ) -- 创建了4个分桶 clustered by(bage) into 4 buckets row format delimited fields terminated by ','; insert into table bucket3 select id, name, age from peo; 0: jdbc:hive2://hadoop101:10000> select * from bucket3; +--------------+----------------+---------------+--+ | bucket3.bid | bucket3.bname | bucket3.bage | +--------------+----------------+---------------+--+ | 40 | OPERATIONS | 1700 | | 30 | SALES | 1900 | | 20 | RESEARCH | 1800 | | 10 | ACCOUNTING | 1700 | +--------------+----------------+---------------+--+ ``` 在hdfs存储的路径如下,我当前使用的数据库为hivedb2: ``` hivedb2.db/bucket3/ ``` ![](https://img.kancloud.cn/ff/4d/ff4d87ae131ab62611a35f1efcb8cee6_1503x420.png)