hive分区——静态分区和动态分区

hive分区——静态分区和动态分区

文章目录

  • hive分区——静态分区和动态分区
    • 一、 Hive以及分区简介
    • 二、静态分区
    • 三、动态分区
    • 四、二者区别与联系

一、 Hive以及分区简介

  1. hive
    hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询功能,能将SQL语句转变成MapReduce任务来执行。
  2. hive分区
    hive 为了避免全表查询,从而引进分区,将数据进行划分,减少不必要的查询,从而提高效率。
    eg:
    hive分区——静态分区和动态分区_第1张图片

二、静态分区

建表语句:

create table users(
userid string,
username string,
sex string
)
partitioned by (year int,month int)
row format delimited fields terminated by ','
location '......';

表结构,字段增加分区字段
hive分区——静态分区和动态分区_第2张图片
ps:静态分区需要手动添加

-- 单个分区创建
alter table users add partition(year='2020',month='7') ;
-- 多个分区创建
alter table users add partition(year='2020',month='6') partition(year='2020',month='7');
-- 单个分区删除
alter table users  drop partition (year='2020',month='6');
-- 多个分区删除
alter table employee_partitioned drop partition (year='2020','month=6'), partition (year='2020',month='7');

ps:
静态分区字段原始表可以不包含此字段,分区时默认添加。

查看分区

show partitions 表名;

ps:如果原始表中包含分区字段,如果使用了静态分区,会按静态分区使用的值覆盖所有字段(不会改变元数据),会造成数据表的数据不正确。可以采取先建表一个临时表,可以用insert的方式代替直接加载原始数据。

三、动态分区

  1. 设置动态分区首先需要设定属性,设置分区模式为非严格模式
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.modenonstrict;
  1. 建表语句:
create table users1(
userid string,
username string,
birthday string,
sex string
)
partitioned by (year string ,month string)
row format delimited fields terminated by ',';

表结构:
hive分区——静态分区和动态分区_第3张图片

  1. 动态分区插入数据:只能用insert 插入
insert into table users partition(year, month)
select .... from users ; -- 插入的字段要和插入表的字段一一对应

四、二者区别与联系

  1. 联系
    二者的建表语句相同,分区可以在建表时一起创建,也可以建表后创建
  2. 区别
    静态分区:支持load和insert两种插入分区方法:load会将分区字段的值全部修改为指定的内容,一般是确定该分区内容是一致的时候才会使用;insert必须先将数据放在一个没有设置分区的普通表中,该方式可以在一个分区内存储一个范围的内容,但是从普通表中选出插入的字段不能包含分区字段,因为分区字段已经被定义。适合已经确认分区的文件,分区相对较少的并且固定,适合增量导入。
    动态分区:分区字段需要在数据表中存在,是在sql执行的时候进行分区;只能用insert方式插入数据。分区比较多的,适合全量导入。

你可能感兴趣的:(linux,hive,大数据,hdfs,大数据,hive)