hive-03-hive的分区
程序员文章站
2022-04-28 23:46:43
...
1.hive分区与Bucket的畏难情绪
刚刚开始学习,这个的时候,一直感觉他比较难,看名字就觉得不好理解,但是实际上学起来超级简单。
2.出现背景
这个东西为什么出来呢?来看一个需求,技术的的出现总是因为有了需求才会诞生的。
假设我们有数据宾馆的近10年的数据,格式如下
每列的意义
| hotel | | |
| h_id | id |
| | h_region | 旅馆行政区划 |
| | h_hname | 旅馆名称 |
| | h_address | 旅馆地址 |
| | h_uname | 姓名 |
| | h_code | 证件号码 |
| | h_start | 开房时间 |
| | h_end | 退房时间 |
| | h_start_m | 开房时间时间戳 |
| | h_end_m | 退房时间时间戳 |
| | h_homecode | 入住房号 |
数据案例:
1,2,宾馆642,杭州市下城区xx484路373号,姓名65,U104,2006/06/23 00:00:00,2006/06/23 00:03:00,1150992000000,1150992180000,495
2,8,宾馆29,杭州市余杭区xx866路927号,姓名64,U193,2006/06/24 00:00:00,2006/06/24 00:16:00,1151078400000,1151079360000,376
3,8,宾馆190,杭州市余杭区xx81路801号,姓名56,U149,2006/06/24 00:00:00,2006/06/24 00:10:00,1151078400000,1151079000000,67
4,8,宾馆771,杭州市余杭区xx570路341号,姓名60,U870,2006/06/25 00:00:00,2006/06/25 00:06:00,1151164800000,1151165160000,761
5,1,宾馆584,杭州市上城区xx177路847号,姓名13,U552,2006/06/26 00:00:00,2006/06/26 00:09:00,1151251200000,1151251740000,583
6,5,宾馆375,杭州市西湖区xx532路372号,姓名93,U362,2006/06/27 00:00:00,2006/06/27 00:01:00,1151337600000,1151337660000,470
410,1,宾馆212,杭州市上城区xx67路444号,姓名35,U295,2007/01/09 00:00:00,2007/01/09 00:03:00,1168272000000,1168272180000,6
411,0,宾馆732,杭州市其他区xx447路975号,姓名71,U546,2007/01/09 00:00:00,2007/01/09 00:09:00,1168272000000,1168272540000,912
412,0,宾馆502,杭州市其他区xx700路944号,姓名46,U580,2007/01/09 00:00:00,2007/01/09 00:01:00,1168272000000,1168272060000,742
413,8,宾馆907,杭州市余杭区xx817路444号,姓名60,U653,2007/01/10 00:00:00,2007/01/10 00:21:00,1168358400000,1168359660000,629
414,7,宾馆426,杭州市萧山区xx529路190号,姓名25,U425,2007/01/11 00:00:00,2007/01/11 00:16:00,1168444800000,1168445760000,985
415,3,宾馆227,杭州市拱墅区xx572路114号,姓名12,U453,2007/01/11 00:00:00,2007/01/11 00:11:00,1168444800000,1168445460000,734
416,7,宾馆804,杭州市萧山区xx879路358号,姓名4,U234,2007/01/11 00:00:00,2007/01/11 00:12:00,1168444800000,1168445520000,156
每年都会有很多数据,假设是每年宾馆数据为1000万条,那么十年就是1000*10=1亿条数据,传统的做法是把所有数据都放到一个表中,建表语句如下
create table hotel(
h_id bigint,
h_region string,
h_hname string,
h_address string,
h_uname string,
h_code string,
h_start string,
h_end string,
h_start_m bigint,
h_end_m bigint,
h_homecode string)
然后我们要查询2007年的数据
select * from hotel where 2016 < h_start and h_start < 2018
但是这句话,我们要扫面整个表,大约是1亿条数据,每条语句算1秒的话,我们需要1亿秒查询时间。
但是我们这样做,事先把2006年的数据放到一个表中,把2007年的数据放到一个表中,这样的话我们查询某个年度,只需要查询对应的表,就可以了,这时候查询1000万条万条数据,每条语句算1秒的话,我们需要1000万秒查询时间。整整提高了10倍的查询速度。
hive的分区就是这个原理。
尝试一下
准备数据/opt/moudles/01_all_test_data/02_flume_dir_to_hdfs_and_hbase_and_hive/aa.txt
1 aa 2013-08-16
2 bb 2013-08-16
3 cc 2013-08-16
4 ee 2013-08-16
5 ff 2013-08-16
准备数据/opt/moudles/01_all_test_data/02_flume_dir_to_hdfs_and_hbase_and_hive/a2.txt
6 aa1 2013-08-17
7 bb2 2013-08-17
8 cc3 2013-08-17
9 ee4 2013-08-17
10 ff5 2013-08-17
建立数据库
hive> create database flume_on_hive;
OK
Time taken: 0.068 seconds
hive> use flume_on_hive;
OK
Time taken: 0.068 seconds
建立表格partitioned by (ds string) 以ds分区,ds是在实际存储不存在的
hive> create table invites (id int, name string) partitioned by (ds string) row format delimited fields terminated by ',' stored as textfile;
OK
Time taken: 2.136 seconds
添加数据
hive> load data local inpath '/opt/moudles/01_all_test_data/02_flume_dir_to_hdfs_and_hbase_and_hive/aa.txt' overwrite into table invites partition (ds='2013-08-16');
Loading data to table flume_on_hive.invites partition (ds=2013-08-16)
OK
Time taken: 2.572 seconds
hive> load data local inpath '/opt/moudles/01_all_test_data/02_flume_dir_to_hdfs_and_hbase_and_hive/a2.txt' overwrite into table invites partition (ds='2013-08-17');
Loading data to table flume_on_hive.invites partition (ds=2013-08-17)
OK
Time taken: 6.065 seconds
界面监控查看
现在可以看到了,ds就是分区文件夹的名称前缀。
hive> select * from invites where ds ='2013-08-12';
OK
Time taken: 2.553 seconds
hive> select * from invites where ds ='2013-08-16';
OK
1 aa 2013-08-16
2 bb 2013-08-16
3 cc 2013-08-16
4 ee 2013-08-16
5 ff 2013-08-16
Time taken: 0.267 seconds, Fetched: 5 row(s)
hive> select * from invites where ds ='2013-08-17';
OK
6 aa1 2013-08-17
7 bb2 2013-08-17
8 cc3 2013-08-17
9 ee4 2013-08-17
10 ff5 2013-08-17
Time taken: 0.211 seconds, Fetched: 5 row(s)
hive> select * from invites ;
OK
1 aa 2013-08-16
2 bb 2013-08-16
3 cc 2013-08-16
4 ee 2013-08-16
5 ff 2013-08-16
6 aa1 2013-08-17
7 bb2 2013-08-17
8 cc3 2013-08-17
9 ee4 2013-08-17
10 ff5 2013-08-17
Time taken: 0.326 seconds, Fetched: 10 row(s)
上一篇: 大数据企业学习篇03_3------hive 高级
下一篇: Hive 基础知识中的重点