[Hive基础]-- 动态分区与静态分区_余额不足

CSDN博客_kudu 静态分区 动态分区 · · 65 次点击 · · 开始浏览    

 

前言

1、Hive分区的概念与传统关系型数据库分区不同。

2、传统数据库的分区方式:如oracle,分区独立存在于字段,里面存储真实的数据,在数据进行插入的时候自动分配分区。

3、Hive的分区方式:Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并非一个实际字段。

即,当在插入数据的时候指定分区,其就是新建一个目录或者子目录,或者在原有的目录上添加数据文件。

 

动态分区和静态分区(Hive-0.14以后的特性)

1、动态分区:分区不固定;关键在于“动态”,不需要人为使用 alter table 命令执行添加分区

2、静态分区:分区固定,需要认为使用 alter table 命令添加分区

最大区别:动态分区与静态分区区别就是不指定分区目录,由系统自己选择。

 

举例

1、静态分区表

创建学生表,以city 分区

create table t_student (name string,age int) partitioned by (city string) row format delimited fields terminated by '\t' STORED AS TEXTFILE;

准备本地数据文件 t_student.txt,内容 “名字/年龄”,将以城市(city)作为分区,以\t 分割字段

cassie    20
luck    20
tom    22
lazy    20
room    29
jef    23

把数据插入到 t_student 表中(实际上 load 操作相当于把文件移动到HDFS的Hive目录下)

load data local inpath '/home/hdfs/hive/t_student.txt' into table t_student partition (city='beijing');

查询 t_student 表数据,发现有 3列,分别是 name,age,city

select * from t_student;

查询hdfs 目录

 

2、动态分区表

问题一:如果用静态分区,那么在插入的时就必须要先知道分区类型,且每个分区写一个load data或者 alter table 。
解决方法:使用动态分区,可简化问题,可以根据查询得到的数据动态分配到分区里。

1) 启用动态分区

set hive.exec.dynamic.partition=true;

查看当前状态

2)创建2个表(t_people、t_teacher)

有分区字段:city,dt_time

create table t_people (name string,age int) partitioned by (city string,dt_time int) row format delimited fields terminated by '\t' STORED AS TEXTFILE;

create table t_teacher (name string,age int) partitioned by (city string,dt_time int) row format delimited fields terminated by '\t' STORED AS TEXTFILE;

先往 t_teacher 中插入数据

insert into table t_teacher partition(city='beijing',dt_time=20190301) select name,age from t_student; 

insert into table t_teacher partition(city='tianjin',dt_time=20190302) select name,age from t_student; 

 

再测试使用动态分区的插入语句

insert overwrite table t_people partition(city='hongkong',dt_time) select name, age, dt_time from t_teacher;

发现t_people表会根据 dt_time 列的值自动分区了!

hdfs 目录

注意


1、动态分区不允许主分区采用动态列而副分区采用静态列,目的是为了避免所有的主分区都要创建副分区静态列所定义的分区

2、动态分区可以允许所有的分区列都是动态分区列,但是要首先设置一个参数

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

hive.exec.dynamic.partition.mode 的默认值是strict,即不允许分区列全部是动态的,目的是为了防止用户有可能原意是只在子分区内进行动态建分区。

 

参考

https://cwiki.apache.org/confluence/display/Hive/DynamicPartitions

 

以上仅供参考,如有不足之处,请批评指正!

本文来自:CSDN博客_kudu 静态分区 动态分区

感谢作者:CSDN博客_kudu 静态分区 动态分区

查看原文:[Hive基础]-- 动态分区与静态分区_余额不足

65 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传