hive是有多种表类型的,分四种,内部表、外部表、分区表、桶表
建立外部表,不使用LOCATION,会在默认在/hive/warehouse/数据库名称/表名,建立目录否用LOCATION方式建表,会影响在HDFS是否生成新目录(表名)。但是不影响外部表和内部表的功能。
create external table external_table( key string ) location '/data/external'
load data local inpath '/data/soft/hivedata/external_table.data' into table external_table;
此时表目录存在/data/external,而表数据存在 /data/external/external_table.data
当删除表时候, drop table external_table;表数据依旧存在
备注:EXTERNAL必须大写,小写不生效:
分区可以理解为分类,通过分区把不同类型的数据放到不同目录。分区表的意义在于优化查询,查询时尽量利用分区字段,如果不使用分区字段,就会全表扫描,最典型的一个场景是把天作为分区字段,查询的时候指定天
hdfs会自动在表的目录下 ,为每个分区创建一个分区目录
create table partition_1(
id int ,
name string
) partitioned by (dt string)
row format delimited
fields terminated by '\t'
load data local inpath '/data/soft/hivedata/partition_1.data'
into table partition_1 partition(dt='2022-01-01');
alter table partition_1 add partition(dt ='2022-01-02');
create table partition_2(
id int ,
name string
)partitioned by (year int ,school string)
row format delimited
fields terminated by '\t'
其中数据文件只要有id和name这两个字段就可以,具体year和school两个区分字段在加载分区的时候指定的
load data local inpath '/data/soft/hivedata/partition_2.data' into table partition_2 partition (year='20220101',school='li');
alter table ex_par add partition(year=20220103,school='bao')
location '/data/soft/hivedata/partition_2.data';
分区的值根据后续的查询结果,动态的确定,根据查询结果的值自动分区
语法问题:Column repeated in partitioning columns 这里的意思是 一个字段不能既做普通列又不能做分区字段,语法错误
异常时候sql为:
修改后sql为:
桶表是对数据进行哈希取值,然后放到不同文件中存储,物理上,每个桶就是表(或分区)里的一个文件
分区表示把数据划分到不同目录进行存储,分桶表把数据划分到不同文件下进行存储
创建桶:
create table bucket_tb(id int) clustered by (id) into 4 buckets;
创建表并导入数据
create table b_source(id int);
load data local inpath '/data/soft/hivedata/b_source.data' into table b_source ;
往桶里导入数据
insert into table bucket_tb select id from b_source where id is not null;
拉链表专门为了解决在数据仓库中数据变化如何实现数据存储问题,顾名思义,所谓 拉链,就是记录历史。记录 一个事物从开始,一直到当前状态的所有历史变化的信息。
实现步骤:1、采集增量数据到增量表中
2、将增量表和历史拉链表数据合并,结果写到临时表中
3、将临时表数据覆盖到拉链表中