Hive之Bucket 桶表(六)
来源:互联网 发布:node sass 安装失败 编辑:程序博客网 时间:2024/05/23 01:13
Bucket 桶表的基本相关概念
- 对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。基本可以这么说分区表是粗粒度的划分,桶在细粒度的划分。当数据量比较大,我们需要更快的完成任务,多个map和reduce进程是唯一的选择。
但是如果输入文件是一个的话,map任务只能启动一个。此时bucket table是个很好的选择,通过指定CLUSTERED的字段,将文件通过hash打散成多个小文件。
把表(或者分区)组织成桶(Bucket)有两个理由:
获得更高的查询处理效率。桶为表加上了额外的结构,Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如JOIN操作。对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
使取样(sampling)更高效。在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。
桶表的操作演示:
1.创建桶表,我们使用CLUSTERED BY 子句来指定划分桶所有的列和划分的桶的个数。
CREATE TABLE bucketed_user (id INT, name STRING) CLUSTERED BY (id) INTO 4 BUCKETSROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
2、查看表结构
hive> desc bucketed_user; OK id int name string Time taken: 0.052 seconds, Fetched: 2 row(s)
t_user表 数据如下:
hive> select * from t_user; OK 1 hello 2 world 3 java 4 hadoop 5 android 6 hive 7 hbase 8 sqoop 9 sqark 1 hello 2 world 3 java 4 hadoop 5 android 6 hive 7 hbase 8 sqoop 9 sqark 1 aaaa 1 bbbb 1 cccc 1 dddd Time taken: 0.076 seconds, Fetched: 22 row(s)
将t_user表数据加载到bucketed_user表中
- 向这种带桶的表里面导入数据有两种方式,一种是外部生成的数据导入到桶表,一种是利用hive来帮助你生成桶表数据。
- 由于hive在load数据的时候不能检查数据文件的格式与桶的定义是否匹配,如果不匹配在查询的时候就会报错,所以最好还是让hive来帮你生成数据,简单来说就是利用现有的表的数据导入到新定义的带有桶的表中
>insert overwrite table bucketed_user select * from t_user;运行过程如下:Query ID = centosm_20170325122000_5f5c9c5f-9d6f-4f4b-9b94-d1d257ed852fTotal jobs = 1Launching Job 1 out of 1Number of reduce tasks determined at compile time: 4In order to change the average load for a reducer (in bytes): set hive.exec.reducers.bytes.per.reducer=<number>In order to limit the maximum number of reducers: set hive.exec.reducers.max=<number>In order to set a constant number of reducers: set mapreduce.job.reduces=<number>Starting Job = job_1488032149798_0006, Tracking URL = http://centosm:8088/proxy/application_1488032149798_0006/Kill Command = /home/centosm/hadoopM/bin/hadoop job -kill job_1488032149798_0006Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 42017-03-25 12:20:20,784 Stage-1 map = 0%, reduce = 0%2017-03-25 12:20:47,857 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 3.6 sec2017-03-25 12:21:47,186 Stage-1 map = 100%, reduce = 67%, Cumulative CPU 9.39 sec2017-03-25 12:22:20,580 Stage-1 map = 100%, reduce = 79%, Cumulative CPU 17.81 sec2017-03-25 12:22:24,591 Stage-1 map = 100%, reduce = 87%, Cumulative CPU 20.31 sec2017-03-25 12:22:25,778 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 23.46 secMapReduce Total cumulative CPU time: 23 seconds 460 msecEnded Job = job_1488032149798_0006Loading data to table default.bucketed_userMapReduce Jobs Launched: Stage-Stage-1: Map: 1 Reduce: 4 Cumulative CPU: 27.3 sec HDFS Read: 18519 HDFS Write: 381 SUCCESSTotal MapReduce CPU Time Spent: 27 seconds 300 msecOKTime taken: 177.489 seconds
运行后查
hive> select * from bucketed_user; OK 8 sqoop 4 hadoop 4 hadoop 8 sqoop 1 hello 1 cccc 1 bbbb 1 aaaa 9 sqark 5 android 1 dddd 1 hello 9 sqark 5 android 6 hive 6 hive 2 world 2 world 7 hbase 3 java 7 hbase 3 java Time taken: 0.082 seconds, Fetched: 22 row(s)
在hive仓库中的数据
[centosm@centosm test]$hdfs dfs -ls /user/hive/warehouse/bucketed_user Found 4 items -rwxr-xr-x 1 centosm supergroup 17 2017-03-25 12:22 /user/hive/warehouse/bucketed_user/000000_0 -rwxr-xr-x 1 centosm supergroup 26 2017-03-25 12:22 /user/hive/warehouse/bucketed_user/000001_0 -rwxr-xr-x 1 centosm supergroup 15 2017-03-25 12:22 /user/hive/warehouse/bucketed_user/000002_0 -rwxr-xr-x 1 centosm supergroup 15 2017-03-25 12:22 /user/hive/warehouse/bucketed_user/000003_0 [centosm@centosm test]$ [centosm@centosm test]$ hdfs dfs -cat /user/hive/warehouse/bucketed_user/000000_0 8,sqoop 4,hadoop 4,hadoop 8,sqoop [centosm@centosm test]$ hdfs dfs -cat /user/hive/warehouse/bucketed_user/000001_0 1,hello 1,cccc 1,bbbb 1,aaaa 9,sqark 5,android 1,dddd 1,hello 9,sqark 5,android [centosm@centosm test]$ hdfs dfs -cat /user/hive/warehouse/bucketed_user/000002_0 6,hive 6,hive 2,world 2,world [centosm@centosm test]$ hdfs dfs -cat /user/hive/warehouse/bucketed_user/000003_0 7,hbase 3,java 7,hbase 3,java
运用tablesample 进行查询
hive> select * from bucketed_user tablesample(bucket 1 out of 4 on id);;OK8 sqoop4 hadoop4 hadoop8 sqoopTime taken: 0.104 seconds, Fetched: 4 row(s)hive> > select * from bucketed_user tablesample(bucket 2 out of 4 on id);;OK1 hello1 cccc1 bbbb1 aaaa9 sqark5 android1 dddd1 hello9 sqark5 androidTime taken: 0.067 seconds, Fetched: 10 row(s)hive> > select * from bucketed_user tablesample(bucket 3 out of 4 on id);;OK6 hive6 hive2 world2 worldTime taken: 0.075 seconds, Fetched: 4 row(s)
ablesample的作用就是让查询发生在一部分桶上而不是整个数据集上,上面就是查询4个桶里面第一个桶的数据;相对与不带桶的表这无疑是效率很高的,因为同样都是需要一小部分数据,但是不带桶的表需要使用rand()函数在整个数据集上检索。
结论:由上述运行结果可以很明显得出分桶会将同一个用户id的文件放到同一个桶中,一个桶也会同时存在多个用户id的数据,例如/user/hive/warehouse/bucketed_user/000003_0 这个桶会存储所有id为3和7的数据。这样当我们要查询具体某一个id对应的所有的数据便可大大的缩小了查找的范围。
注:参考权威指南3
以及 http://www.cnblogs.com/juefan/p/3414476.html
- Hive之Bucket 桶表(六)
- hive桶(bucket)简介
- hive bucket
- hive bucket
- hive bucket
- hive bucket
- hive bucket
- Hive bucket
- hive bucket
- hive bucket
- Hive分桶之BUCKET详解
- Hive 基础之:分区、桶、Sort Merge Bucket Join
- Hive 基础之:分区、桶、Sort Merge Bucket Join
- Hive 基础之:分区、桶、Sort Merge Bucket Join
- Hive 基础之:分区、桶、Sort Merge Bucket Join
- Hive 基础之:分区、桶、Sort Merge Bucket Join
- Hive 基础之:分区、桶、Sort Merge Bucket Join
- Hive 基础之:分区、桶、Sort Merge Bucket Join
- 动态代理
- walk
- 递推递归练习F
- git版本管理手册
- 安卓屏幕适配的方案
- Hive之Bucket 桶表(六)
- CSDN-markdown编辑器语法——字体、字号与颜色
- 2016蓝桥杯C/C++省赛 四平方和(暴力,水题)
- centos7 mysql5.6安装
- 蟠桃记
- 算法导论 练习题 4.4-7
- Telnet远程连接
- TRSSERVER学习笔记
- dropwizard学习笔记v1.0