hive bucket 桶

本文详细介绍了Hive中分桶的概念及其应用场景,如通过分桶提高JOIN操作的效率及进行数据采样等。同时,文章还提供了具体的操作实例,帮助读者理解如何在实际工作中运用这些特性。
对于每一个表(table)或者分区,Hive可以进一步组织成桶。Hive也是针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。采用桶能够带来一些好处,比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
hive中table可以拆分成partition,table和partition可以通过‘CLUSTERED BY ’进一步分bucket,bucket中的数据可以通过‘SORT BY’排序。
bucket主要作用:
1. 数据sampling
2. 提升某些查询操作效率,例如mapside join
需要特别注意的是:clustered by和sorted by不会影响数据的导入,这意味着,用户必须自己负责数据如何如何导入,包括数据的分桶和排序。
'set hive.enforce.bucketing = true'  可以自动控制上一轮reduce的数量从而适配bucket的个数,当然,用户也可以自主设置mapred.reduce.tasks去适配bucket 个数,推荐使用'set hive.enforce.bucketing = true' 

示例:
建临时表student_tmp,并导入数据:
hive> desc student_tmp;         
OK
id      int
age     int
name    string
stat_date       string
Time taken: 0.106 seconds
hive> select * from student_tmp;
OK
1       20      zxm     20120801
2       21      ljz     20120801
3       19      cds     20120801
4       18      mac     20120801
5       22      android 20120801
6       23      symbian 20120801
7       25      wp      20120801
Time taken: 0.123 seconds

建student表:
hive>create table student(id INT, age INT, name STRING)
        >partitioned by(stat_date STRING) 
        >clustered by(id) sorted by(age) into 2 bucket
        >row format delimited fields terminated by ',';

设置环境变量:
       >set hive.enforce.bucketing = true; 

插入数据:
       >from student_tmp 
        >insert overwrite table student partition(stat_date="20120802") 
        >select id,age,name where stat_date="20120801" sort by age;

查看文件目录:
$ hadoop fs -ls /user/hive/warehouse/studentstat_date=20120802/
Found 2 items
-rw-r--r--   1 work supergroup         31 2012-07-31 19:52 /user/hive/warehouse/student/stat_date=20120802/000000_0
-rw-r--r--   1 work supergroup         39 2012-07-31 19:52 /user/hive/warehouse/student/stat_date=20120802/000001_0

查看sampling数据:
hive> select * from student tablesample(bucket 1 out of 2 on id);                                                                               
Total MapReduce jobs = 1
Launching Job 1 out of 1
.......
OK
4       18      mac     20120802
2       21      ljz     20120802
6       23      symbian 20120802
Time taken: 20.608 seconds

tablesample是抽样语句,语法:TABLESAMPLE(BUCKET x OUT OF y)
y必须是table总bucket数的倍数或者因子。hive根据y的大小,决定抽样的比例。例如,table总共分了64份,当y=32时,抽取 (64/32=)2个bucket的数据,当y=128时,抽取(64/128=)1/2个bucket的数据。x表示从哪个bucket开始抽取。例 如,table总bucket数为32,tablesample(bucket 3 out of  16),表示总共抽取(32/16=)2个bucket的数据,分别为第3个bucket和第(3+16=)19个bucket的数据
### Hive的概念 在Hive中,分是一种数据分区技术,用于提高查询性能。通过将大表划分为更小、可管理的部分,能够显著提升某些类型的查询效率。具体来说,Bucket number = hash_function(bucketing_column) mod num_buckets[^1]。 这意味着每条记录会根据指定列(bucketing_column)的哈希值被分配到不同的内,而总共有num_buckets个。这种机制使得相同键值的数据会被放置在同一物理文件夹下,便于后续处理。 ### 创建分表的方法 创建一个带有分功能的表格时,需要定义两个重要参数: - `CLUSTERED BY` 子句指定了用来计算哈希函数并决定如何分布数据的一个或多个字段; - `INTO ... BUCKETS` 指定要创建的具体的数量。 下面是一个简单的例子来说明这一点: ```sql CREATE TABLE sales ( id INT, name STRING, amount DOUBLE ) CLUSTERED BY (id) INTO 8 BUCKETS; ``` 此命令将会基于`id`字段对销售记录进行散列,并将其均匀分布在八个独立的存储单元里。 ### 抽样操作中的应用 当涉及到大规模数据分析场景下的随机抽样需求时,可以通过设置特定条件来进行高效采样。例如,在拥有大量历史订单信息的情况下,如果想要获取其中一部分样本作为研究对象,则可以利用如下SQL语句实现这一目标: ```sql SELECT * FROM sales TABLESAMPLE(BUCKET x OUT OF y ON columnname); ``` 这里的关键在于理解x和y的关系以及它们各自代表的意义。x表示从哪一个具体的开始选取;y则决定了最终所选样本占总体比例大小——即总共多少份之一[y必须是总数目的因数][^2]。同时需要注意的是,columnname应当与建表时设定的一致。 ### 实际案例分析 假设有一个名为customer_visits的大规模访问日志数据库,为了更好地理解和优化用户体验路径,分析师希望从中提取具有代表性的小批量用户行为模式供进一步探索。此时就可以考虑采用上述提到的技术手段完成这项工作。 首先确保该表已经按照适当的标准进行了合理的分设计,比如按用户的唯一标识符uid来做划分。接着执行类似于这样的查询请求以获得所需的结果集: ```sql -- 假设原表已预先配置好为32个, 并且是以'uid'列为依据构建. SELECT * FROM customer_visits TABLESAMPLE(BUCKET 1 OUT OF 4 ON uid); -- 这意味着只读取全部四分之一的数据量 ``` 这样不仅简化了实际运算过程中的资源消耗情况,同时也保证了所得结论的有效性和可靠性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值