需要建立一个备份带分区的数据表,拷贝时若采用静态分区方式需要写 N 行语句,因此可以使用动态分区,节省大量时间。

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

一)hive 中支持两种类型的分区:

  • 静态分区 SP(static partition)
  • 动态分区 DP(dynamic partition)

静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断。详细来说,静态分区的列实在编译时期,通过用户传递来决定的;动态分区只有在 SQL 执行时才能决定。

二)实战演示如何在 hive 中使用动态分区

1、创建一张分区表,包含两个分区 dt 和 ht 表示日期和小时

  1. CREATE TABLE partition_table001
  2. (
  3. name STRING,
  4. ip STRING
  5. )
  6. PARTITIONED BY (dt STRING, ht STRING)
  7. ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";

2、启用 hive 动态分区,只需要在 hive 会话中设置两个参数:

  1. set hive.exec.dynamic.partition=true;
  2. set hive.exec.dynamic.partition.mode=nonstrict;

注意,动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区。hive.exec.dynamic.partition.mode它的默认值是 strick,即不允许分区列全部是动态的,这是为了防止用户有可能原意是只在子分区内进行动态建分区,但是由于疏忽忘记为主分区列指定值了,这将导致一个 dml 语句在短时间内创建大量的新的分区(对应大量新的文件夹),对系统性能带来影响。

3、把 partition_table001 表某个日期分区下的数据 load 到目标表 partition_table002

使用静态分区时,必须指定分区的值,如:

  1. create table if not exists partition_table002 like partition_table001;
  2. 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、使用动态分区

  1. 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

  1. INSERT OVERWRITE TABLE T PARTITION (ds, hr)
  2. SELECT key, value, ds, hr FROM srcpart WHERE ds is not null and hr>10;

2、DP/SP 结合

  1. INSERT OVERWRITE TABLE T PARTITION (ds='2010-03-03', hr)
  2. SELECT key, value, /*ds,*/ hr FROM srcpart WHERE ds is not null and hr>10;

3、当 SP 是 DP 的子分区时,以下 DML 会报错,因为分区顺序决定了 HDFS 中目录的继承关系,这点是无法改变的

  1. -- throw an exception
  2. INSERT OVERWRITE TABLE T PARTITION (ds, hr = 11)
  3. SELECT key, value, ds/*, hr*/ FROM srcpart WHERE ds is not null and hr=11;

4、多张表插入

  1. FROM S
  2. INSERT OVERWRITE TABLE T PARTITION (ds='2010-03-03', hr)
  3. SELECT key, value, ds, hr FROM srcpart WHERE ds is not null and hr>10
  4. INSERT OVERWRITE TABLE R PARTITION (ds='2010-03-03, hr=12)
  5. 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 列

  1. CREATE TABLE T (key int, value string) PARTITIONED BY (ds string, hr int) AS
  2. SELECT key, value, ds, hr+1 hr1 FROM srcpart WHERE ds is not null and hr>10;

6、上面展示了 DP 下的 CTAS 用法,如果希望在 partition 列上加一些自己的常量,可以这样做

  1. CREATE TABLE T (key int, value string) PARTITIONED BY (ds string, hr int) AS
  2. 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静态与动态分区理解相关推荐

  1. hive:默认允许动态分区个数为100,超出抛出异常:

    hive:默认允许动态分区个数为100,超出抛出异常: 参考文章: (1)hive:默认允许动态分区个数为100,超出抛出异常: (2)https://www.cnblogs.com/yy3b2007 ...

  2. 82.Hive SQL插入动态分区的异常分析

    82.1 问题情况 INSERT - SELECT语句向Parquet或者ORC格式的表中插入数据时,启用了动态分区,无法正常执行 Hive客户端: Task with the most failur ...

  3. hive实现全自动动态分区

    我们在业务中往往会遇到一种情况就是: 现有的业务已经有很多的数据堆积,并且需要根据现有的数据以分区的形式来建立数据仓库,这样的话就需要将表中的一个字段作为分区字段,以这个字段的值作为分区的依据. 那么 ...

  4. mysql 分桶_使用hive脚本一键动态分区、分区又分桶以及脚本步骤详细详解(亲测成功)...

    一.动态分区以及从linux本地文件映射到hive表中. partitioned.sql脚本中的创造数据: mkdir /mytemp cd mytemp vi stu_score.txt 1,zha ...

  5. Hive静态分区表动态分区表

    静态分区表: 一级分区表: CREATE TABLE order_created_partition (orderNumber STRING, event_time STRING ) PARTITIO ...

  6. hive动态分区shell_Hive动态分区 参数配置及语法

    Hive本身是不支持动态分区的.. 但动态分区是真的方便啊..不然手动维护要累死..按日期甚至小时来分区时动辄就好几千上万的分区..手动到哪一年去..? 想要用动态分区要先做一些设置来修改默认的配置. ...

  7. hive 动态分区实现 (hive-1.1.0)

    hive 动态分区实现 (hive-1.1.0) 笔者使用的hive版本是hive-1.1.0 hive-1.1.0动态分区的默认实现是只有map没有reduce,通过执行计划就可以看出来.(执行计划 ...

  8. Hive动态分区和分桶

    Hive动态分区和分桶 1. Hive动态分区和分桶 1.Hive动态分区 1.hive的动态分区介绍 2.hive的动态分区配置 3.hive动态分区语法 2.Hive分桶 1.Hive分桶的介绍 ...

  9. Hive的分区(partition)-动态分区

    Hive的分区 声明:本文为博主参考网上资料整理的文章,未经博主允许不得转载,如有问题,欢迎指正. 一.概述 分区是hive存放数据的一种方式.将列值作为目录来存放数据,就是一个分区.这样查询时使用分 ...

最新文章

  1. python适合做后端开发吗-想从事Python 后端开发?
  2. np.nonzero()函数的解析
  3. redis源码笔记-adlist
  4. 第三次学JAVA再学不好就吃翔(part108)--带缓冲的字符流
  5. asp.net mvc使用TagBuilder的应用程序集
  6. 休眠锁定模式– PESSIMISTIC_READ和PESSIMISTIC_WRITE如何工作
  7. 点击劫持:X-Frame-Options未配置
  8. Centos7 修改、更换源
  9. Java可以用到军事方面吗_恭喜遥三运载火箭发射成功,浅谈java在军事方面的运用!...
  10. 为什么你的发行版仍然在使用“过时的”Linux 内核? | Linux 中国
  11. Python简单的多线程demo:装逼写法
  12. 通过微信公众号实现微信快捷登陆
  13. 在keil中创立一个头文件
  14. 会声会影2018 转码导出H.265/HEVC编码视频
  15. 带你走进组件化(三)—— 曲径
  16. 【小说】玻璃碎片-第二章
  17. 071.魔王语言翻译
  18. 为何企业级架构日益盛行?
  19. 软件测试面试宝典,大厂测试高频面试题详解一网打尽,速看
  20. Days 24 网络编程 正则表达式

热门文章

  1. VUE3(二十四)自定义alert弹窗组件
  2. 课程笔记-三维点云处理01 ——Introduction and Basic Algorithms
  3. MFC 执行顺序总结
  4. 吴恩达机器学习ex1——通过人口预测小摊经济状况
  5. matlab 序列对称,共轭对称序列.PPT
  6. HmailServer部署应用(完整过程,含故障处理)
  7. Chrome网页接口测试工具
  8. 数据库与Java语言之间的鹊桥——JDBC
  9. 光辉国际宣布陈兆丰先生为新任中国区总裁
  10. 百度天气预报接口使用详细