说明
本文操作基于 弹性 MapReduce(EMR)。
知识储备
Hive指定表的存储路径: hive可以在创建表的时候通过location指定表的存储路径,若不指定localtion则文件默认存储在hive-site.xml配置文件中hive.metastore.warehouse.dir配置项指向的路径。 此外,Hive的分区表还可以指定分区的存储路径。通过如下语句可以给分区指定:
1. 添加分区并指定location。例如:
代码语言:javascript复制alter table test add partition (b=1) location 'path_to_dir';
2. 修改已有分区的location。例如:
代码语言:javascript复制alter table test partition (b=1) set location 'path_to_dir';
使用场景
分区表可以是外表也可以是内表。实际业务场景中常常将时间列作为分区的依据,时间久远的历史数据是冷数据,而新数据是热数据。可能有以下几个原因希望将部分数据存储到cos上:
- 历史数据一般很少修改,很适合放在cos上(读取性能更优),且cos比hdfs更经济。
- hdfs的存储的数据太多容易导致datanode进程挂掉。
实操过程
1. hive建表
代码语言:javascript复制create table test (a int) partitioned by (b int);
2. 添加分区
代码语言:javascript复制alter table test add partition (b=1) location 'cosn://qiushan-1314/hive/test/b=1'
3. 插入数据
代码语言:javascript复制insert into test partition (b=1) values (1);
insert into test partition (b=1) values (2);
insert into test partition (b=1) values (3);
发现此处插入的数据仍存储在hdfs上
代码语言:javascript复制“Moving data to directory hdfs://HDFS3758/hive/test/b=1/.hive-staging_hive_2019-08-28_15-11-56_214_8585498400588849067-1/-ext-10000
Loading data to table default.test partition (b=1)”
4. 修改分区地址
代码语言:javascript复制alter table test partition (b=1) set LOCATION 'cosn://qiushan-1314/hive/test/b=1'
5. 迁移分区数据
代码语言:javascript复制hadoop distcp /usr/hive/warehouse/test/b=1 cosn://qiushan-1314/hive/tes
6. 删除hdfs上分区数据
代码语言:javascript复制hadoop fs -rm -r /usr/hive/warehouse/test/b=1
7. 查询分区数据
代码语言:javascript复制select * from test where b = 1;
缺陷
- insert操作可以成功执行,但数据依然存储在表的location指向的目录下;
- load操作无法执行
Failed with exception Wrong FS: cosn://qiushan-1314/hive/test/b=1, expected: hdfs://10.10.10.10:4007
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!
邀请人:岳涛,社区ID:7348459