Hive(六)分区表

在Hive中,分区表是一种特殊的表,它根据数据的分区键值将数据存储在不同的目录中。这样可以在查询时只扫描特定分区的数据,从而提高查询效率。

分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。

Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择查询所需要的指定分区,这样的查询效率会提高很多。

Browsing HDFS 查看webui

1.准备数据

shanxi.txt

1.太原

2.忻州

3.大同

4.晋中

hebei.txt

1.石家庄

2.邯郸

3.邢台

4.唐山

jiangsu.txt

1.南京

2.苏州

3.徐州

2.建立分区表

create table cities (id int, cityname string) partitioned by (province string) row format delimited fields terminated by '.' ;

 3.加载数据

load data local inpath '/data/jiangsu.txt' into table cities partition(province='jiangsu');

load data local inpath '/data/shanxi.txt' into table cities partition(province='shanxi');

load data local inpath '/data/hebei.txt' into table cities partition(province='hebei');

查看数据文件夹

在Hive中,每一个分区对应一个单独的目录

 查看select * from cities内容,发现城市名后边的数据有了身份prince的分类

但是真正的数据里是没有prince的

在查询数据的时候,指定了分区字段,分区表的查询效率就会高于未分区的表,如select * from cities where province='hebei';

在查询数据的时候,进行了跨分区查询,此时未分区表的查询效率就要高于分区表 select * from cities where id=1;(这是一个跨分区查询)

手动添加分区

建立一个sichuan.txt的文件

alter table cities add partition (province='sichuan') location '/user/hive/warehouse/cities/province=sichuan/sichuan.txt';

1.成都

2.江油

3.广元

在hdfs中新建目录,并将sichuan.txt传上去

然后select * from cities,发现并没有把数据加载进来。为甚么,因为元数据表是记录在元数据库中的,不执行下面的语句,数据是进不来的

需要手动添加分区

删除分区

alter table cities drop partition(province = 'sichuan');

alter table cities add partition (province='sichuan') location '/user/hive/warehouse/cities/province=sichuan';

select * from cities where province='sichuan'  发现数据已经进来了

批量导入分区数据

Hive将分区表的所有分区信息都保存在了元数据中,只有元数据与HDFS上的分区路径一致时,分区表才能正常读写数据。若用户手动创建/删除分区路径,Hive都是感知不到的,这样就会导致Hive的元数据和HDFS的分区路径不一致。再比如,若分区表为外部表,用户执行drop partition命令后,分区元数据会被删除,而HDFS的分区路径不会被删除,同样会导致Hive的元数据和HDFS的分区路径不一致。

若出现元数据和HDFS路径不一致的情况,可通过如下几种手段进行修复。

(1)add partition
若手动创建HDFS的分区路径,Hive无法识别,可通过add partition命令增加分区元数据信息,从而使元数据和分区路径保持一致。

(2)drop partition
若手动删除HDFS的分区路径,Hive无法识别,可通过drop partition命令删除分区元数据信息,从而使元数据和分区路径保持一致。

(3)msck
若分区元数据和HDFS的分区路径不一致,还可使用msck命令进行修复,

新建数据

zhejiang.txt

1.杭州

2.萧山

3.海宁

shandong.txt

1.济南

2.青岛

3.烟台

分别建立两个文件夹province=zhejiang  province=shandong,并将shangdong.txt zhejiang.txt考入到各自的文件夹下

执行修复表命令msck repair table cities;

发现数据已经导入

此外还有

msck repair table table_name add partitions:该命令会增加HDFS路径存在但元数据缺失的分区信息。
msck repair table table_name drop partitions:该命令会删除HDFS路径已经删除但元数据仍然存在的分区信息。
msck repair table table_name sync partitions:该命令会同步HDFS路径和元数据分区信息,相当于同时执行上述的两个命令。
msck repair table table_name:等价于msck repair table table_name add partitions命令。【默认值】

修改分区名

alter table cities partition(province='__HIVE_DEFAULT_PARTITION__') rename to partition (province='sichuan');

动态分区

以上数据在Hive的分区表中,分区字段在原始数据中并不存在,而是在加载数据的时候来手动指定。假如分区字段在原始数据中存在,那么需要考虑动态分区。将未分区表中的数据查询出来放到分区表中

例如数据cities.txt

1.guizhou.贵阳
2.guizhou.六盘水
3.gansu.兰州
4.gansu.嘉峪关

建立临时表去管理原始数据

create table cities_tmp (tid int, tprovince string,tcity_name string) row format delimited fields terminated by '.';

load data local inpath '/home/data/cities.txt' into table cities_tmp;

将数据加载到临时表中

load data local inpath '/cities.txt' into table cities_tmp;

关闭严格模式,开启动态分区

set hive.exec.dynamic.partition.mode=nonstrict;

将未分区表中的数据查询出来放到分区表中

insert into table cities partition(province) select tid, tcity_name, tprovince from cities_tmp distribute by tprovince;

多字段来进行分区:

在Hive中,也允许对多字段来进行分区。此时,前一个字段形成的目录会包含后一个字段形成的目录。

多字段分区通常用于对数据来进行多级分类,例如省市县,学生的年级和班级,商品的分类等

原始数据 student.txt

onenianji.oneban.1.zhangsan

onenianji.twoban.2.lisi

fournianji.fourban.3.haili

建立临时表来管理数据

create table students_tmp (nianji string, banji string, id int, name string) row format delimited fields terminated by '.';

加载数据

load data local inpath '/student.txt' into table students_tmp;

根据年级和班级,将学生区分开 - 建立分区表

create table student(id int, name string) partitioned by (nianji string, banji string) row format delimited fields terminated by '.';

动态分区

关闭严格模式,开启动态分区

set hive.exec.dynamic.partition.mode=nonstrict;

insert into student partition(nianji, banji) select id, name, nianji, banji from students_tmp distribute by nianji, banji ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫1981

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值