赞
踩
hive表的模型
为什么分区?
hive在查询数据时为避免全表扫描而引入分区技术,分区技术就是将数据划分到多个目录中。
怎么分区?
日期、地域、年、月、小时等一切能将数据分散开的标识即可。
分区的本质:
在表或者分区下创建目录。分区目录名称是:分区字段=分区值 比如:dt=20210707
分区字段:
mysql的分区字段使用的是表内字段;
hive的分区字段使用的是表外字段。
分区语法:
-- 在创建Hive表时加上下面分区语法
[PARTITIONED BY (COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...)]
注意事项:
1.hive的分区名不区分大小写
2.hive的分区字段是一个伪字段,不会再表中出现,但是可以用于过滤等查询。
3.一张表可以有一个或者多个分区,并且分区下面也可以有一个或者多个分区。
三级分区
- -- 三级分区
- create table if not exists part3(
- id int,
- name string
- )
- partitioned by (year string,month string,day string)
- row format delimited fields terminated by ',';
-
-
-
- -- 加载数据 insert into
- insert into part3 partition(year='2021',month='07',day='08')
- select
- id,
- name
- from part1
- where dt = '20210708';
-
-
-
- --load方式加
-
- load data local inpath '/home/part2' into table part3 partition(year='2021',month='07',day='08');
- load data local inpath '/home/part1' into table part3 partition(year='2021',month='07',day='07');
分区操作
- -- 查看分区
- show partitions part1;
- -- 添加单分区
- alter table part1 add partition(dt='2021-07-09');
- -- 添加多个分区
- alter table part1 add partition(dt='20210709') partition(dt='20210710');
- -- 增加分区并制定数据
- alter table part1 add partition(dt='2021-07-11') location '/input';
- -- 修改分区的hdfs路径(直接修改元数据)
- alter table part1 partition(dt='2021-07-11') set location '/out/01'; --也行
- alter table part1 partition(dt='2021-07-11') set location 'hdfs://hadoop01:9000/out/01';
- -- 删除分区(删除元数据、文件)---外部表是不会删除hdfs中的分区数据的
- alter table part1 drop partition(dt='20210709');
- alter table part1 drop partition(dt='2021-07-09'),partition(dt='2021-07-11');
静态分区
- 静态分区:加载分区时指定分区值.
- 动态分区:加载分区时未指定分区值。历史数据或者一段时间的数据存放到一起,后期需要将其分区。
- 混合分区:既有静态又有动态。
- 动态分区属性:
- 动态分区的属性:
- hive.exec.dynamic.partition=true
- hive.exec.dynamic.partition.mode=nonstrict
- hive.exec.max.dynamic.partitions=1000
- hive.exec.max.dynamic.partitions.pernode=100
- --创建表
- create table dy_part2(
- id int,
- name string
- )
- partitioned by (year string,month string,day string)
- row format delimited fields terminated by ',';
-
- create table dy_part3(
- id int,
- name string
- )
- partitioned by (year string,month string,day string)
- row format delimited fields terminated by ',';
-
- -- 动态加载
- set hive.exec.dynamic.partition.mode=nonstrict;
- insert into dy_part2 partition(year,month,day)
- select
- id,
- name,
- year,
- month,
- day
- from part3
- ;
-
- -- 混合分区加载
- insert into dy_part3 partition(year='2021',month,day)
- select
- id,
- name,
- month,
- day
- from part3
- where year = '2021'
- ;
严格模式
- 严格模式至少要有一个静态分区,非严格模式可以全是动态分区
- set hive.mapred.mode=nonstrict/strict;
- <name>hive.mapred.mode</name>
- <value>nonstrict</value>
- <description>
- The mode in which the Hive operations are being performed.
- In strict mode, some risky queries are not allowed to run. They include:
- Cartesian Product. 笛卡尔积查询
- No partition being picked up for a query. 分区表不用分区字段过滤
- Comparing bigints and strings. bigint和string比较查询
- Comparing bigints and doubles. bigint和doubles比较查询
- Orderby without limit. orderby语句不带limit查询
- </description>
- #如下语句不允许查询
- hive (test)> select * from flow2 order by up desc;
- hive (test)> select * from part3;
-
-
- 分区注意事项:
- 1. 分区字段不建议使用中文。
- 2. 一般不建议使用动态分区,因为动态分区会使用mapreduce来进行查询数据,如果分区数据过多,导致`namenode`和`resourcemanager`的性能瓶颈。所以建议在使用动态分区前尽可能预知分区数量。
- 3. 分区属性的修改都可以修改元数据和hdfs数据内容。
- 4、分区表一般适用于行为数据。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。