hive教程:静态分区表的操作(创建、导入数据、查询、增加分区、插入数据、删除分区、查看分区、元信息) 作者:马育民 • 2021-03-19 14:33 • 阅读:10343 # 创建分区表 ``` create external table user_article( uid int, aid int) partitioned by (`date` string) row format delimited fields terminated by ','; ``` **解释:** - uid:用户的id - aid:该用户查看文章的id - date:日期,分区字段 **注意:** 分区字段 **不能是 表中的字段**,可以将 分区字段 看作表的 **伪字段** # 查看是否动态分区表 ``` set hive.exec.dynamic.partition ``` 执行结果如下: ``` hive.exec.dynamic.partition=true ``` 说明是 **动态分区表** **提示:** 默认是 **动态分区表** # 设置 全局 静态分区 ``` set hive.exec.dynamic.partition=false; ``` # 特点 ### 不能根据数据 生成分区 静态分区,不能根据插入的数据,动态的生成分区,执行会报错 ``` INSERT into table user_article(uid,aid,`date`) values (103,1634,'20200108'); ``` ### 必须指定分区 静态分区模式下,插入数据,必须手动指定要插入到哪个分区中 ``` insert into table user_article partition(`date`='20200107') (uid,aid) values ('200','2001') ``` # 导入数据 ### 数据准备 假设每个 `.log` 文件有上百万条记录 ``` mkdir /program/datas ``` ``` cd /program/datas ``` **编辑 user_article_20200101.log** ``` vim user_article_20200101.log ``` 内容 ``` 10,1000 20,1001 ``` **编辑 user_article_20200102.log** ``` vim user_article_20200102.log ``` 内容 ``` 30,1002 40,1003 ``` **编辑 user_article_20200103.log** ``` vim user_article_20200103.log ``` 内容 ``` 50,1004 60,1005 ``` ### 导入数据 **注意:** 分区表加载数据时,必须指定分区 ``` load data local inpath '/program/datas/user_article_20200101.log' into table user_article partition(`date`='20200101'); ``` ``` load data local inpath '/program/datas/user_article_20200102.log' into table user_article partition(`date`='20200102'); ``` ``` load data local inpath '/program/datas/user_article_20200103.log' into table user_article partition(`date`='20200103'); ``` ### hdfs web管理页面 [![](http://65242847.gitee.io/pic/hive/QQ20210319101430.png)](http://65242847.gitee.io/pic/hive/QQ20210319101430.png) # 查询 ### 普通查询 ``` select * from user_article ``` 显示该表中 **所有数据**(不考虑是哪个分区) ### 单分区查询 ``` select * from user_article where `date`='20200101'; ``` **注意:** 加上分区字段,就 **不是全表扫描**,查询速度快 ### 多分区联合查询 **方式一:** ``` select * from user_article where `date` in ('20200101','20200102','20200103'); ``` 执行结果: ``` uid|aid |date | ---|----|--------| 10|1000|20200101| 20|1001|20200101| 30|1002|20200102| 40|1003|20200102| 50|1004|20200103| 60|1005|20200103| ``` **方式二:** ``` select * from user_article where `date`='20200101' or `date`='20200102' or `date`='20200103'; ``` **方式三:(不推荐)** 执行特别慢,一个结果集拼另一个结果集 ``` select * from user_article where `date`='20200101' union select * from user_article where `date`='20200102' union select * from user_article where `date`='20200103'; ``` 转成 MR 程序运行,速度慢 # 插入数据 ``` insert into table user_article partition(`date`='20200101') (uid,aid) values ('200','2001') ``` 当所有字段都有数据时,可省略如下: ``` insert into table user_article partition(`date`='20200101') values ('200','2001') ``` **注意:** 可以向不存在的分区插入数据 # 增加分区 ### 创建单个分区 ``` alter table user_article add partition(`date`='20200104'); ``` **查看 hdfs web管理页面** [![](http://65242847.gitee.io/pic/hive/QQ20210319101750.png)](http://65242847.gitee.io/pic/hive/QQ20210319101750.png) ### 同时创建多个分区 ``` alter table user_article add partition(`date`='20200105') partition(`date`='20200106'); ``` # 删除分区 ### 删除单个分区 ``` alter table user_article drop partition (`date`='20200106'); ``` **查看 hdfs web管理页面** `date=20200106` 文件夹已经没有了 ### 同时删除多个分区 ``` alter table user_article drop partition (`date`='20200104'), partition(`date`='20200105'); ``` # 查看表的分区 ``` show partitions user_article; ``` 显示结果: ``` partition | -------------| date=20200101| date=20200102| date=20200103| ``` # mysql partitions 表保存分区表信息 [![](http://65242847.gitee.io/pic/hive/QQ20210319134436.png)](http://65242847.gitee.io/pic/hive/QQ20210319134436.png) 原文出处:http://malaoshi.top/show_1IXmvLDx2ZM.html