各位看官,今天我们来讨论下再Hive中的动态分区和混合分区方面的一些知识点以及相关的一些问题。

前面我们已经讲过管理表和外部表的一般分区的一些知识点,对于需要对表创建很多的分区,那么用户就需要些很多的SQL代码,举例:

比如我创建了一张分区表emp,需要 将分区表employees中的某些区数据按分区导入到表emp中,如果我需要导入的分区有上百个,那么就需要写上百个INSERT ...SELECT ...语句。如下:

FROM jimdb.employees
INSERT OVERWRITE TABLE emp
PARTITION(province='guangdong',city='shenzhen')
SELECT name,salary,subordinates,deductions,address
WHERE province='guangdong' AND city='shenzhen'
INSERT OVERWRITE TABLE emp
PARTITION(province='hainan',city='haikou')
SELECT name,salary,subordinates,deductions,address
WHERE province='hainan' AND city='haikou'
INSERT OVERWRITE TABLE emp
PARTITION(province='zhejiang',city='hangzhou')
SELECT name,salary,subordinates,deductions,address
WHERE province='zhejiang' AND city='hangzhou'
INSERT OVERWRITE TABLE emp
PARTITION(province='shandong',city='qingdao')
SELECT name,salary,subordinates,deductions,address
WHERE province='shandong' AND city='qingdao'

..........

..........

.........

一. Hive提供了一个动态分区的功能,其可以基于查询参数推断出需要创建的分区名称。而之前我们一直使用的这种叫做静态分区。

举例1:假如我希望创建一张与employees表结构一样的表emp,如何将employees的数据按分区导入到emp中呢。

hive (default)> CREATE TABLE IF NOT EXISTS emp LIKE jimdb.employees;
OK
Time taken: 2.387 seconds

为表emp中插入数据;

hive (default)> set hive.exec.dynamic.partition.mode=nostrict;
hive (default)> INSERT OVERWRITE TABLE emp
> PARTITION(province,city)
> SELECT name,salary,subordinates,deductions,address,province,city
> FROM jimdb.employees;
Query ID = hadoop_20180617092034_4fd7e0ee-0916-4b85-91e1-1d569110c3e7
.........

........
Stage-Stage-1: HDFS Read: 30511582 HDFS Write: 31358028 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
name salary subordinates deductions address province city
Time taken: 16.077 seconds

Hive是根据select语句最后的两个列来确定分区字段province,city的值。目标表的分区字段名称可以与源表的分区字段名称不一样。

二.混合分区

由于在动态分区中目标表的分区是根据源表的分区字段的值来确定的,如果由于用户错误的操作,导致目标表创建了非常多的小分区,这会导致集群性能的下降,因为管理分区是需要HDFS 的namenode进行管理。如果存在非常多的分区,那么最终会超出NameNode对系统云数据信息的处理能力。因为NameNode必须要将所有的系统文件的元数据信息保存在内存中。理想的分区方案是不应该导致太多的分区和文件夹目录,并且每个目录下的文件应该足够得大,应该是文件系统中块的若干倍。

混合分区就是混合使用静态分区和动态分区来创建目标表的分区,但是静态分区的字段必须放到动态分区字段的前面。由于混合分区部分的限制了分区的 键的值,可以有效 控制分区的数目不会过多,从而错误的导致创建很多的分区。

比如我希望给emp表中加入shandong与zhejiang两个省份的数据,可以使用如下的混合分区的方法进行数据的导入:

hive (default)> FROM jimdb.employees
> INSERT OVERWRITE TABLE emp
> PARTITION(province='shandong',city)
> SELECT name,salary,subordinates,deductions,address,city
> WHERE province ='guangdong'
> INSERT OVERWRITE TABLE emp
> PARTITION(province='zhejiang',city)
> SELECT name,salary,subordinates,deductions,address,city
> WHERE province ='zhejiang';
Query ID = hadoop_20180617094311_8a38bc83-a6cb-40a9-87d5-f4c4f66364d2
Total MapReduce CPU Time Spent: 0 msec

.........

.........
OK
name salary subordinates deductions address city
Time taken: 11.95 seconds

可以看到一个规律,就是说在目标表中对分区中限定值得静态分区键的那一列,目标表就就认为这一列不属于需要插入的列值,因此在select语句中需要将这一列去除掉,不然就会报错。比如我限定了province='shandong',那么select选择的列中就取出掉province这一列。如下面这种方法就会报错:

hive (default)>
> INSERT OVERWRITE TABLE emp
> PARTITION(province='guangdong',city)
> SELECT name,salary,subordinates,deductions,address,province,city
> FROM jimdb.employees
> WHERE province ='guangdong';
FAILED: SemanticException [Error 10044]: Line 1:23 Cannot insert into target table because column number/types are different 'city': Table insclause-0 has 6 columns, but query has 7 columns.

hive (default)> INSERT OVERWRITE TABLE emp
> PARTITION(province='guangdong',city)
> SELECT *
> FROM jimdb.employees
> WHERE province ='guangdong';
FAILED: SemanticException [Error 10044]: Line 1:23 Cannot insert into target table because column number/types are different 'city': Table insclause-0 has 6 columns, but query has 7 columns.

这两个语句都是同样的错误,目标表emp由于在分区上限定了province,因此在插入数据时,不将这一列作为伪列看待,因此只有6列,而select语句中显式的将两个分区键放到最后,或者select * 都会将分区键放到正常列的最后面,这样就会存在7个列,因此插入数据时报错。

三.动态分区的相关参数

在Hive中,针对动态分区有几个参数需要注意。

1.hive.exec.dynamic.partition,这个参数是开启动态分区功能,默认是false不开启。

2. hive.exec.dynamic.partition.mode 这个参数是动态分区模式,缺省值是strict,表示动态分区前面必须有静态分区字段,不能只有动态分区,可以设置为nostrict,表示允许所有分区都是动态的。

3. hive.exec.dynamic.partitions.pernode ,缺省值是100,指每个mapper或reducer可以创建的最大动态分区个数,如果某个mapper或者reducerchangshi 创建大于这个数目的分区,那么就会报错。

4. hive.exec.max.dynamic.partitions 缺省值是+1000,指的是一个动态分区创建语句可以创建的最大分区数目,如果超过这个数目就会抛出一个致命错误。

5.  hive.exec.max.created.files  缺省值是100000,全局 可以创建的最大文件个数。

四.当动态分区模式是strict时,如果创建动态分区,会抛出错误。

hive (default)> set hive.exec.dynamic.partition.mode=strict;
hive (default)> INSERT OVERWRITE TABLE emp
> PARTITION(province,city)
> SELECT name,salary,subordinates,deductions,address,province,city
> FROM jimdb.employees;
FAILED: SemanticException [Error 10096]: Dynamic partition strict mode requires at least one static partition column. To turn this off set hive.exec.dynamic.partition.mode=nonstrict

hive动态分区和混合分区的更多相关文章

  1. hive 动态分区与混合分区

    hive的分区概念,相信大家都非常了解了.通过将数据放在hdfs不同的文件目录下,查表时,只扫描对应分区下的数据,避免了全表扫描. 提升了查询效率. 关于hive分区,我们还会用到多级分区.动态分区. ...

  2. Hive分区(静态分区+动态分区)

    Hive分区的概念与传统关系型数据库分区不同. 传统数据库的分区方式:就oracle而言,分区独立存在于段里,里面存储真实的数据,在数据进行插入的时候自动分配分区. Hive的分区方式:由于Hive实 ...

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

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

  4. hive动态分区与静态分区

    测试目的:1.分区表的动态分区与静态分区2.每层数据,数据流向,数据是否在每层都保留一份测试结果:1.动态分区/静态分区略2.每层表的数据都会保留,因此在生产上odm层的数据是可以删除的(不管是内表还 ...

  5. Hive动态分区和分桶(八)

    Hive动态分区和分桶 1.Hive动态分区 1.hive的动态分区介绍 ​ hive的静态分区需要用户在插入数据的时候必须手动指定hive的分区字段值,但是这样的话会导致用户的操作复杂度提高,而且在 ...

  6. Hive动态分区详解

    目录 动态分区调整 注意 动态分区插入 动静分区结合 例子 动态分区调整 动态分区属性:设置为true表示开启动态分区功能(默认为false)hive.exec.dynamic.partition=t ...

  7. 什么是hive的静态分区和动态分区,它们又有什么区别呢?hive动态分区详解

    面试官问我,什么是hive的静态分区和动态分区,这题我会呀. 简述 分区是hive存放数据的一种方式,将列值作为目录来存放数据,就是一个分区,可以有多列. 这样查询时使用分区列进行过滤,只需根据列值直 ...

  8. 曲演杂坛--重建索引后,还使用混合分区么?(Are mixed pages removed by an index rebuild?)

    原文来自:http://www.sqlskills.com/blogs/paul/mixed-pages-removed-index-rebuild/ 在SQL SERVER 中,区是管理空间的基本单 ...

  9. windows动态磁盘导致的分区问题

    上次说到由于装双系统导致我的win7启动不了了,一直以为是不是在ubuntu的安装界面点错了什么东西导致的,甚至认为是不是server的安装程序有点bug,直到今天继续折腾才发现了问题所在,跟ubun ...

随机推荐

  1. JAVA进阶17

    ---恢复内容开始--- 间歇性混吃等死,持续性踌躇满志系列-------------第17天 1.递归结构 递归是一种常见的解决问题的方法,即把问题逐渐简单化.递归的基本思想就是自己就是“自己调用自 ...

  2. BlockChain 的跨链技术的重要性和必要性

    本期我们将从跨链技术的重要性和必要性.畅想区块链未来世界.什么是跨链.目前四种跨链技术的对比.构建EOS同构跨链体系群.EOCS跨链技术介绍.跨链通道.中继等几个层面带大家走进EOS跨链和EOCS的世 ...

  3. Linux查看日志工具

    ⒈journalctl journalctl是Centos7才有的工具用于systemd统一管理所有unit的启动日志,只用一个journalctl命令就可以查看所有的日志(包括内核日志和应用日志), ...

  4. PyCharm 项目删除

    Pycharm 删除项目具体操作如下: 1.选择菜单 File   close project 2.选择要删除的项目右上角选择× 3.找到项目所在目录,删除相应文件夹 之后再次打开pycharm 发现 ...

  5. Matlab imshow, image, imagesc 三者详细分析

    1.显示RGB图像 相同点:这三个函数都是把m*n*3的矩阵中的数值当做RGB值来显示的. 区别:imshow将图像以原始尺寸显示,image和imagesc则会对图像进行适当的缩放(显示出来的尺寸大 ...

  6. m3u8下载转码一次完成

    最近看到有部分网站开始加入视频解析服务,虽然这种服务会损害土豆优酷等视频托管商的权益,但是,烦人的广告也让我们开始寻找有没有什么比较靠谱的解决方法~实际上很多网站都在使用m3u8文件格式,里面都是视频 ...

  7. I/O多路复用之select、poll、epoll

    很早之前有写过篇IO多路复用的文章:https://www.cnblogs.com/klcf0220/archive/2013/05/14/3077003.html 参考链接:https://segm ...

  8. USACO Training Section 1.1 题解(共4题)

    第一题 题目传送门:你的飞碟在这儿 分析 水题一道,输入两个字符串,将它们转换为数字并同时相乘,然后判断一下它们是不是对于47同余就可以了. 代码 #include<bits/stdc++.h& ...

  9. linux 笔记整理

    1.常使用的进程管理命令 ps   显示显示主动的进程     .  top 显示所用运行的进程   .  关闭进程   kill [pro Number ]  .  关闭名为H的所有进程 killa ...

  10. scrapy爬取数据保存csv、mysql、mongodb、json

    目录 前言 Items Pipelines 前言 用Scrapy进行数据的保存进行一个常用的方法进行解析 Items item 是我们保存数据的容器,其类似于 python 中的字典.使用 item ...