表类型
内部表
内部表是Hive中默认的表类型,表数据默认存储在hdfs中warehouse目录下,删除表时,hdfs中的数据也直接删除,表的元数据信息也会删除
外部表
特点:
- 建表时需要在建表语句中包含External
- 外部表的数据不会存放在hdfs的warehouse目录中,建表时需要指定数据在hdfs中的位置
- 删除外部表的时候实际数据不会删除,元数据信息会删除
建表语句:
location:表示数据在hdfs中的位置,没有这个目录会自动创建
create external table external_table(name string)
row format delimited fields terminated by ' '
lines terminated by '\n'
location '/data/external';
内部表转外部表
alter table tablename set tblproperties('external'='true');
外部表转内部表
alter table tablename set tblproperties('external'='false');
分区表
分区可以理解分类,通过分区把不同类型的数据放到不同的目录中,可以对一个或多个字段指定为分区字段。
分区的意义在于优化查询,查询时尽量使用分区字段,如果不适用分区字段就会进行全表扫描,最典型的就是把天作为分区字段,查询时指定日期
内部分区表建表语句:
create table p1(id int comment 'ID',
name string comment 'name')
partitioned by (day string)
row format delimited fields terminated by ' '
lines terminated by '\n';
导入数据:load data local inpath '/home/data/p1.data' into table p1 partition(day='20230629');
展示分区信息: show partitions p1;
删除分区:alter table p1 drop partition(day='20230629');
查询语句,指定分区条件:select * from p1 where day=20230629;
外部分区表建表语句:
create external table p2(name string)
partitioned by (day string)
row format delimited fields terminated by ' '
lines terminated by '\n'
location '/data/external';
当删除外部分区表的分区信息时,这个分区的数据就无法再进行查询。可以通过重新绑定分区信息来进行查询。原理是表的分区信息存储在元数据中,而真实数据在hdfs中,当元数据分区信息删除时就会找不到映射关系。
重新绑定分区信息:
alter table p1 add partitioned(day='20230629') location '/data/external';
导入数据:
load data local inpath '/data/p1.data' into table p1 partitioned(day='20230629');
桶表
桶表是对数据进行哈希取值,然后放到不同的文件中进行存储,物理上一个桶就是一个分区或者表里的一个文件。
桶表是为了解决数据倾斜问题,比如多个分区中,某几个分区数据量很大,几个分区数据量较小。
建表语句:
-- 根据id进行哈希 分布到4个桶中
create table b1(id int,name string)clustered by (id) into 4 buckets;
开启桶,开启后会更具桶的数据创建对应个数的reduce任务:set hive.enforce.bucketing=true;
导入数据:不能使用load方式进行数据导入,需要通过查询其他表的数据通过insert语句进行导入。
insert into b1 select id,stu_name from t4;
导入数据后会在hdfs中创建4个文件,用来存储对应的数据,文件数量就等于桶的数量。
桶表的作用:
- 数据抽样
- 提高查询效率,避免join
数据抽样:
-- 会将b1的数据重新分成4个桶 最后取第一个桶的数据
select * from b1 tablesample(bucket 1 out of 4 on id);
视图
视图不会再hdfs中生成对应的文件,而是听过虚拟表来实现
作用:降低查询的复杂度
创建视图,这个视图只有t3的id和name信息:create view v1 as select id,name form t3;
删除视图:drop view v1;
综合案例
需求:Flume按天把日志数据采集到HDFS中的对应目录中,使用SQL按天统计每天的相关指标。
hdfs的/data/20230630目录下有两个目录,用来表示同一个日期下的不同类型文件:
{
"onlineCarCount": 0,
"provinceList": [
{
"provinceId": "110000",
"provinceName": "北京市",
"level": null,
"longitude": "116.407387",
"lat": "39.904179",
"areaEventDetailList": [
{
"provinceId": "110000",
"provinceName": "北京市",
"level": null,
"onlineCarCount": 0,
"heightCount": 0,
"middleCount": 0,
"lowCount": 0
}
]
}
}