hive静态与动态分区理解
需要建立一个备份带分区的数据表,拷贝时若采用静态分区方式需要写 N 行语句,因此可以使用动态分区,节省大量时间。
Hive 的分区方式:由于 Hive 实际是存储在 HDFS 上的抽象,Hive 的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。
一)hive 中支持两种类型的分区:
- 静态分区 SP(static partition)
- 动态分区 DP(dynamic partition)
静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断。详细来说,静态分区的列实在编译时期,通过用户传递来决定的;动态分区只有在 SQL 执行时才能决定。
二)实战演示如何在 hive 中使用动态分区
1、创建一张分区表,包含两个分区 dt 和 ht 表示日期和小时
- CREATE TABLE partition_table001
- (
- name STRING,
- ip STRING
- )
- PARTITIONED BY (dt STRING, ht STRING)
- ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";
2、启用 hive 动态分区,只需要在 hive 会话中设置两个参数:
- set hive.exec.dynamic.partition=true;
- set hive.exec.dynamic.partition.mode=nonstrict;
注意,动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区。hive.exec.dynamic.partition.mode它的默认值是 strick,即不允许分区列全部是动态的,这是为了防止用户有可能原意是只在子分区内进行动态建分区,但是由于疏忽忘记为主分区列指定值了,这将导致一个 dml 语句在短时间内创建大量的新的分区(对应大量新的文件夹),对系统性能带来影响。
3、把 partition_table001 表某个日期分区下的数据 load 到目标表 partition_table002
使用静态分区时,必须指定分区的值,如:
- create table if not exists partition_table002 like partition_table001;
- insert overwrite table partition_table002 partition (dt='20150617', ht='00') select name, ip frompartition_table001 where dt='20150617' and ht='00';
此时我们发现一个问题,如果希望插入每天 24 小时的数据,则需要执行 24 次上面的语句。而动态分区会根据 select 出的结果自动判断数据改 load 到哪个分区中去。
4、使用动态分区
- insert overwrite table partition_table002 partition (dt, ht) select * from partition_table001 wheredt='20150617';
hive 先获取 select 的最后两个位置的 dt 和 ht 参数值,然后将这两个值填写到 insert 语句 partition 中的两个 dt 和 ht 变量中,即动态分区是通过位置来对应分区值的。原始表 select 出来的值和输出 partition 的值的关系仅仅是通过位置来确定的,和名字并没有关系,比如这里 dt 和 st 的名称完全没有关系。
只需要一句 SQL 即可把 20150617 下的 24 个 ht 分区插到了新表中。
三)静态分区和动态分区可以混合使用
1、全部 DP
- INSERT OVERWRITE TABLE T PARTITION (ds, hr)
- SELECT key, value, ds, hr FROM srcpart WHERE ds is not null and hr>10;
2、DP/SP 结合
- INSERT OVERWRITE TABLE T PARTITION (ds='2010-03-03', hr)
- SELECT key, value, /*ds,*/ hr FROM srcpart WHERE ds is not null and hr>10;
3、当 SP 是 DP 的子分区时,以下 DML 会报错,因为分区顺序决定了 HDFS 中目录的继承关系,这点是无法改变的
- -- throw an exception
- INSERT OVERWRITE TABLE T PARTITION (ds, hr = 11)
- SELECT key, value, ds/*, hr*/ FROM srcpart WHERE ds is not null and hr=11;
4、多张表插入
- FROM S
- INSERT OVERWRITE TABLE T PARTITION (ds='2010-03-03', hr)
- SELECT key, value, ds, hr FROM srcpart WHERE ds is not null and hr>10
- INSERT OVERWRITE TABLE R PARTITION (ds='2010-03-03, hr=12)
- SELECT key, value, ds, hr from srcpart where ds is not null and hr = 12;
5、CTAS,(CREATE-AS 语句),DP 与 SP 下的 CTAS 语法稍有不同,因为目标表的 schema 无法完全的从 select 语句传递过去。这时需要在 create 语句中指定 partition 列
- CREATE TABLE T (key int, value string) PARTITIONED BY (ds string, hr int) AS
- SELECT key, value, ds, hr+1 hr1 FROM srcpart WHERE ds is not null and hr>10;
6、上面展示了 DP 下的 CTAS 用法,如果希望在 partition 列上加一些自己的常量,可以这样做
- CREATE TABLE T (key int, value string) PARTITIONED BY (ds string, hr int) AS
- SELECT key, value, "2010-03-03", hr+1 hr1 FROM srcpart WHERE ds is not null and hr>10;
四)小结:
通过上面的案例,我们能够发现使用 hive 中的动态分区特性的最佳实践:对于那些存在很大数量的二级分区的表,使用动态分区可以非常智能的加载表,而在动静结合使用时需要注意静态分区值必须在动态分区值的前面
转载自:https://www.deeplearn.me/1536.html
hive静态与动态分区理解相关推荐
- hive:默认允许动态分区个数为100,超出抛出异常:
hive:默认允许动态分区个数为100,超出抛出异常: 参考文章: (1)hive:默认允许动态分区个数为100,超出抛出异常: (2)https://www.cnblogs.com/yy3b2007 ...
- 82.Hive SQL插入动态分区的异常分析
82.1 问题情况 INSERT - SELECT语句向Parquet或者ORC格式的表中插入数据时,启用了动态分区,无法正常执行 Hive客户端: Task with the most failur ...
- hive实现全自动动态分区
我们在业务中往往会遇到一种情况就是: 现有的业务已经有很多的数据堆积,并且需要根据现有的数据以分区的形式来建立数据仓库,这样的话就需要将表中的一个字段作为分区字段,以这个字段的值作为分区的依据. 那么 ...
- mysql 分桶_使用hive脚本一键动态分区、分区又分桶以及脚本步骤详细详解(亲测成功)...
一.动态分区以及从linux本地文件映射到hive表中. partitioned.sql脚本中的创造数据: mkdir /mytemp cd mytemp vi stu_score.txt 1,zha ...
- Hive静态分区表动态分区表
静态分区表: 一级分区表: CREATE TABLE order_created_partition (orderNumber STRING, event_time STRING ) PARTITIO ...
- hive动态分区shell_Hive动态分区 参数配置及语法
Hive本身是不支持动态分区的.. 但动态分区是真的方便啊..不然手动维护要累死..按日期甚至小时来分区时动辄就好几千上万的分区..手动到哪一年去..? 想要用动态分区要先做一些设置来修改默认的配置. ...
- hive 动态分区实现 (hive-1.1.0)
hive 动态分区实现 (hive-1.1.0) 笔者使用的hive版本是hive-1.1.0 hive-1.1.0动态分区的默认实现是只有map没有reduce,通过执行计划就可以看出来.(执行计划 ...
- Hive动态分区和分桶
Hive动态分区和分桶 1. Hive动态分区和分桶 1.Hive动态分区 1.hive的动态分区介绍 2.hive的动态分区配置 3.hive动态分区语法 2.Hive分桶 1.Hive分桶的介绍 ...
- Hive的分区(partition)-动态分区
Hive的分区 声明:本文为博主参考网上资料整理的文章,未经博主允许不得转载,如有问题,欢迎指正. 一.概述 分区是hive存放数据的一种方式.将列值作为目录来存放数据,就是一个分区.这样查询时使用分 ...
最新文章
- python适合做后端开发吗-想从事Python 后端开发?
- np.nonzero()函数的解析
- redis源码笔记-adlist
- 第三次学JAVA再学不好就吃翔(part108)--带缓冲的字符流
- asp.net mvc使用TagBuilder的应用程序集
- 休眠锁定模式– PESSIMISTIC_READ和PESSIMISTIC_WRITE如何工作
- 点击劫持:X-Frame-Options未配置
- Centos7 修改、更换源
- Java可以用到军事方面吗_恭喜遥三运载火箭发射成功,浅谈java在军事方面的运用!...
- 为什么你的发行版仍然在使用“过时的”Linux 内核? | Linux 中国
- Python简单的多线程demo:装逼写法
- 通过微信公众号实现微信快捷登陆
- 在keil中创立一个头文件
- 会声会影2018 转码导出H.265/HEVC编码视频
- 带你走进组件化(三)—— 曲径
- 【小说】玻璃碎片-第二章
- 071.魔王语言翻译
- 为何企业级架构日益盛行?
- 软件测试面试宝典,大厂测试高频面试题详解一网打尽,速看
- Days 24 网络编程 正则表达式