hive静态分区与动态分区 (全网搜索整理笔记)

12 篇文章 0 订阅
11 篇文章 0 订阅
  • hive分区。默认是静态分区。
  • 分区的好处:将列值作为目录存放数据,这样查询时,根据分区列过滤,只需查询对应目录下的数据,快速定位,查询效率高。
  • Hive的分区方式:Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并非一个实际字段。
  • 当在插入数据的时候指定分区,其就是新建一个目录或者子目录,或者在原有的目录上添加数据文件

静态分区

  • 静态分区分区的值是确定的
  • 新增分区或者是加载分区数据时,已经指定分区名
    creare table if not exists tablename (ids int, name string)
    partitioned by(year int, month int);
    

动态分区

  • 分区的值是非确定的,由输入数据来确定

实现:

1. 先打开动态分区的设置

set hive.exec.dynamic.partition=true; # 是否允许动态分区
set hive.exec.dynamic.partition.mode=nonstrict;

  • strict:严格模式,最少需要有一个是静态分区
  • nostrict:可以全部是动态分区

设置动态分区,以上两点必须设置

  • 可选:

hive.exec.max.dynamic.partitions=1000

  • 允许动态分区的最大数量(默认1000)

hive.exec.max.dynamic.partitions.pernode =100

  • 单个节点上的mapper/reducer允许创建的最大分区(默认100)

hive.exec.max.created.files

  • 所有映射器和化简器创建的最大文件总数(默认值为100000)
  • 每当创建新文件时,每个映射器/缩减器都会更新Hadoop计数器,从而实现此目的。如果总数超过hive.exec.max.created.files,将引发致命错误并杀死作业。
2.
  • 建表
     create table if not exists tablename(ids int, name string, year int, month int)
    
  • 创建动态分区
    insert into table tablename(ids int, name string)
    partitioned by (year, month);
    

    注意事项:

    1. 动态分区的时候,将会为每一个分区分配reducer数量,当分区数量多的时候,reducer数量将会增加,对服务器是一种灾难
    2. 静态分区不管有无数据都会创建分区,动态分区是有结果集才创建
    3. hive动态分区的严格模式,是为了阻止用户不小心提交恶意hql
      将会阻止以下三种查询:
      	- 对分区表查询,where中过滤字段不是分区字段
      	- 笛卡尔积join查询,join查询语句,不带on或where条件
      	- 对order by查询,不带limit语句
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值