Hive的分区

声明:本文为博主参考网上资料整理的文章,未经博主允许不得转载,如有问题,欢迎指正。

一、概述

分区是hive存放数据的一种方式。将列值作为目录来存放数据,就是一个分区。这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的数据,不扫描其他不关心的分区,快速定位,提高查询效率。hive中支持两种类型的分区:

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

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

二、动态分区说明

关系型数据库(如Oracle)中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition)。

按照常规的方法向分区表中插入数据,如果源数据量很大,那么针对一个分区就要写一个insert,非常麻烦,而且你必须先要知道源数据中都有什么样的数据才能创建分区。例如:

hive> insert overwrite table partition_test partition(stat_date='20110728',province='henan')
select member_id,name
from partition_test_input
where stat_date='20110728' and province='henan';

使用动态分区可以很好的解决上述问题。动态分区可以根据查询得到的数据自动匹配到相应的分区中去。只不过,使用Hive的动态分区,需要进行相应的配置。

三、动态分区的相关配置

●set hive.exec.dynamic.partition=true;–是否允许动态分区
   默认值:false
   是否开启动态分区功能,默认false关闭。
   使用动态分区时候,该参数必须设置成true。

●set hive.exec.dynamic.partition.mode=nonstrict; --分区模式设置
   默认值:strict
   动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区。
   nonstrict模式:表示允许所有的分区字段都可以使用动态分区。

●set hive.exec.max.dynamic.partitions.pernode=1000;–单个节点上的mapper/reducer允许创建的最大分区
   默认值:100
   在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。
   比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。

●set hive.exec.max.dynamic.partitions=1500;–允许动态分区的最大数量
   默认值:1000
   在所有执行MR的节点上,最大一共可以创建多少个动态分区。
   同上参数解释。

●hive.exec.max.created.files=100000;–一个mapreduce作业能创建的HDFS文件最大数
   默认值:100000
   整个MR Job中,最大可以创建多少个HDFS文件。
   一般默认值足够了,除非你的数据量非常大,需要创建的文件数大于100000,可根据实际情况加以调整。

此处补充知识点:使用动态分区可能遇到分区文件数超10万的情况,解决办法参考distribute by控制分区文件数

●hive.error.on.empty.partition=false;–在动态分区插入产生空结果时是否抛出异常
   默认值:false
   当有空分区生成时,是否抛出异常。一般不需要设置。

四、动态分区的操作

创建分区表

create table if not exists partition_test
(member_id  string,name     string
)partitioned by(stat_date string,province string)
;

设置动态分区参数

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions.pernode=1000;
set hive.exec.max.dynamic.partitions=1500;

插入数据
动态分区的使用方法很简单,假设我想向stat_date='20110728’这个分区下面插入数据,至于province插入到哪个子分区下面让数据库自己来判断。那可以这样写:

insert overwrite table partition_test partition(stat_date='20110728',province)
select member_id,name,province
from partition_test_input
where stat_date='20110728';

stat_date叫做静态分区列,province叫做动态分区列。这样stat_date='20110728’的所有数据,会根据province的不同分别插入到/user/hive/warehouse/partition_test/stat_date=20110728/下面的不同的子文件夹下,如果源数据对应的province子分区不存在,则会自动创建,非常方便,而且避免了人工控制插入数据与分区的映射关系存在的潜在风险。

注:select子句中需要把动态分区列按照分区的顺序写出来,静态分区列不用写出来。

五、分区注意细节

1、尽量不要用动态分区,因为动态分区的时候,将会为每一个分区分配reducer数量,当分区数量多的时候,reducer数量将会增加,对服务器是一种灾难。
2、动态分区和静态分区的区别,静态分区不管有没有数据都将会创建该分区,动态分区是有结果集将创建,否则不创建。
3、hive动态分区的严格模式和hive提供的hive.mapred.mode的严格模式。
   hive提供我们一个严格模式:为了阻止用户不小心提交恶意hql
   hive.mapred.mode=nostrict : strict
   如果该模式值为strict,将会阻止以下三种查询:
      (1)对分区表查询,where中过滤字段不是分区字段。
      (2)笛卡尔积join查询,join查询语句,不带on条件或者where条件。
      (3)对order by查询,有order by的查询不带limit语句。
4、动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区。
5、动态分区可以允许所有的分区列都是动态分区列,但是要首先设置一个参数:hive.exec.dynamic.partition.mode。
6、注意!!!
hive用了动态分区,若select语句无数据,则insert overwrite并不会覆盖。因为动态分区由select决定,select语句无数据,分区也无法确定,故无法实现动态覆盖。此时想要修正表数据,需要手动删除该分区。

ALTER TABLE pdata_ams.check_deposit_flow_day DROP IF EXISTS PARTITION(busi_date='2022-03-09');


[参考资料1]:动态分区说明
[参考资料2]:大数据开发学习之Hive的动态分区

Hive的分区(partition)-动态分区相关推荐

  1. Hive分区——Partition(静态分区,动态分区)详解

    文章目录 分区目的 分区的创建 1.创建建表时候不管动态还是静态分区 2.执行load 装载数据 3.查看表结构,查询分区表的数据 4.静态分区: 5.动态分区: 多分区 表分区的增删改查 分区目的 ...

  2. 深圳大数据培训:大数据开发之掌握Hive的静态分区与动态分区

    深圳大数据培训:大数据开发之掌握Hive的静态分区与动态分区 分区是hive存放数据的一种方式.将列值作为目录来存放数据,就是一个分区. 这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的 ...

  3. Hive实践1之【静态分区及动态分区基本操作】

    Hive分区 引言 1.静态分区 1.1 静态分区--单分区 1.2 静态分区--多分区 2.动态分区 2.1 动态分区--单分区 2.2 动态分区--多分区 3.静态+动态分区 4.动态分区优化 引 ...

  4. Hive分区表:静态分区、动态分区、多重分区介绍

    01 分区表的引入.产生背景 现有6份数据文件,分别记录了<王者荣耀>中6种位置的英雄相关信息.现要求通过建立一张表t_all_hero,把6份文件同时映射加载. create table ...

  5. hive的静态分区与动态分区-用法实例

    概述 本文是对[3]的复现 所有的SQL操作都在下方gitee链接中 https://gitee.com/appleyuchi/Flink_Code/blob/master/hive动态静态分区/hi ...

  6. (王道408考研操作系统)第三章内存管理-第一节4:连续分配管理方式(单一连续、固定分区和动态分区分配)

    文章目录 一:单一连续分配 二:固定分区分配 (1)分区大小相等与分区大小不等 (2)分区说明表 三:动态分区分配 (1)采用的数据结构(主要有两种) (2)动态分配分区算法 (3)如何进行分配与回收 ...

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

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

  8. Hive 05_hive变量、动态分区

    hive 参数.变量     --hive当中的参数.变量,都是以命名空间开头     --通过${}方式进行引用,其中system.env下的变量必须以前缀开头 hive 参数设置方式 --1.修改 ...

  9. hive静态分区,动态分区,分桶区别

    文章目录 绪论 创建静态分区表 1.准备数据 2.建表语句 3.添加分区,加载数据 4.进入网页(50070)查看 创建动态分区表 1.准备数据 2.建表语句 1.首先创建普通表 2.加载数据 3.创 ...

最新文章

  1. usaco前两章小结
  2. C#MUD英雄大作战二、乔峰篇(副源码文件连接)
  3. C++编程技巧—对数运算实现
  4. Python环境搭建及第三方库安装和卸载
  5. 学习 jQuery 源码整体架构,打造属于自己的 js 类库
  6. 欢乐鼠标自动点击器_使用ESP32 DIY蓝牙自动点击器,滑屏器
  7. css3制作炫酷导航栏效果 转
  8. 技术干货 | 深度解构 Android 应用面临紧急发版时的救星方案:mPaaS 热修复——DexPatch
  9. Nodejs 分布式事务
  10. 我的手绘2013.01.27
  11. 《快速软件开发》概要
  12. C#中Socket用法,多个聊天和单一聊天。
  13. 1.Hbase集群安装配置(一主三从)
  14. mac 10.9 安装 mysql_mac 下安装 mysql (蛋疼)
  15. 1.恶意软件中的防双开
  16. 计算机使用快捷键大全
  17. Java 常见面试题
  18. 晓得不,中间表是这样被消灭的
  19. 洛谷 P4883 mzf的考验 解题报告
  20. Oracle ERP 仓库(inventory) 词汇 2

热门文章

  1. 做淘客,你已经成功了。
  2. 如何使用pdpipe与Pandas构建管道?
  3. 数据一致性比对(番外)
  4. 询问ChatGPT来了解什么是边缘计算,有哪些特点,有哪些关键技术,和云计算的关系是什么?
  5. 高数计算机软件,扫一扫题目就能算高数!一款大学必备的高数神器
  6. Ie默认HTML主页发现异常,IE浏览器总是出错 怎么解决ie问题
  7. 隐写文件的识别和解码工具——国内首款隐写术识别软件(隐译)
  8. qiankun: 子应用 nuxt框架 嵌入到 主应用vue-cli
  9. 查看计算机计划,win10系统查看任务计划的具体办法
  10. 免费天气数据接口含全国4万个乡镇预报实况