0
点赞
收藏
分享

微信扫一扫

hive数据仓库(4)

鱼满舱 2023-09-12 阅读 29

表类型

内部表

内部表是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目录下有两个目录,用来表示同一个日期下的不同类型文件:

hive数据仓库(4)_hdfs

{
        "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
                    }
                ]
            }
}




举报

相关推荐

0 条评论