【Hive】表分类
Hive中的表有多种类型,每种类型的表都有其适用的场景
用于记录每种表的特性,创建方式以及一些注意事项
1. internal/managed[内部表/托管表]
由Hive完全管理表和数据的生命周期
默认创建的表是内部表
删除表的时候,数据也被删除
2. external[外部表]
是由LOCATION属性指定数据存放地,而不是由默认的warehouse决定的
删除表的时候,表的元数据被删除了,但是数据还在
创建示例
CREATE EXTERNAL TABLE if not exists test_ext ( name string, str_arr ARRAY<string>, t_struct STRUCT<sex:string,age:int>, t_map MAP<string,int>, t_map_arr MAP<string,ARRAY<string>> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' COLLECTION ITEMS TERMINATED BY ',' MAP KEYS TERMINATED BY ':' LOCATION '/user/xw/data/tmp';
3. 临时表
在hive session结束时被删除
4. 分区表
针对目录[将目录切分为子目录]
显示分区
SHOW PARTITIONS <table_name>;
建立分区表
create table test_partition(id int, name string, age int) comment 'table description' PARTITIONED BY (year INT, month INT) row format delimited fields terminated by ',' lines terminated by '\n' stored as textfile;
分区表需要手动激活分区[即给分区建立子目录]
alter table test_partition add partition(year=2017,month=3) partition(year=2017,month=4);
删除分区
alter table test_partition drop if exists partition(year=2017,month=3);
向分区表加载数据
load data local inpath '/home/xw/tmp/table.txt' overwrite into table test_partition partition(year=2016,month=2);
常用的partition keys
date and time locations business logics
5. bucket表
针对文件[将文件切割成片段]
将指定列根据hash算法进行切割,对应列的值相同的记录始终会被划分到同一个桶中
每个bucket的大小的设定:一个比较好的选择是将每个bucket的大小设置为hadoop的blocksize的两倍,例如,blocksize是256MB,则将每个bucket的大小设为512MB
建立bucket表
create table test_bucket(id int, name string, age int) comment 'bucket table' clustered by(id) into 2 buckets row format delimited fields terminated by ',' lines terminated by '\n' stored as textfile;
加载数据到bucket表
INSERT OVERWRITE TABLE test_bucket SELECT * FROM test;
注:不能使用load来加载数据,load加载数据只是将数据put到hdfs上,不经过MR,因而不会划分桶
bucket的划分紧紧依赖于底层的数据加载,为了能够正确加载数据到bucket表中,我们可以:
1.将reduce的数量设为自定义的bucket数
set map.reduce.tasks = 2;
2.设置可以强制划分bucket表
set hive.enforce.bucketing = true;
数据的加载是通过MR进行的,MR中shuffle过程中的拷贝即分区,就可以实现桶表的划分,MR中默认是按照key进行hash分区的,设置reduce的数目与划分bucket表的数量一致,就正好实现了bucket表的划分。