hive的分区概念,相信大家都非常了解了。通过将数据放在hdfs不同的文件目录下,查表时,只扫描对应分区下的数据,避免了全表扫描。

提升了查询效率。

关于hive分区,我们还会用到多级分区、动态分区、混合分区,这些概念是什么含义,又该在何时使用呢?

静态分区

先说下静态分区。静态分区就是人为指定分区名。向分区插入数据的时候也要写明写入哪个分区。

我们给出建表,和插入数据的示例代码:

建表语句:

DROP TABLE IF EXISTS ods.employee;
CREATE TABLE IF NOT EXISTS ods.employee(
xjson STRING
)
COMMENT '员工表'
PARTITIONED BY (province,city)
ROW FORMAT DELIMITED

数据插入语句:

ALTER TABLE ods.employee DROP IF EXISTS PARTITION (`province`=${province},`city`=${city});
ALTER TABLE ods.employee ADD IF NOT EXISTS PARTITION (`province`=${province},`city`=${city})
INSERT OVERWRITE TABLE FINAL.employee PARTITION(`province`=${province},`city`=${city})
SELECT
xjson
FROM ods.employee_full
WHERE `province`=${province},`city`=${city};
tips:

1.进行drop分区,是为了方便重跑。不去手动增加partition也是可以的。

2.写入时用overwrite也是为了方便使用脚本重跑。

2.province`=${province},`city`=${city} 是为了使用调度执行时,可以穿入不同的参数。避免重复的代码。

需要注意的是,

1.我们指定分区的那一列 dt 可以看做hive的伪列,虽然在select查询时,会展现在数据的最后,但不会真正出现在数据中。

2.dt也不应该出现在表的某一列名中,否则会报错。

动态分区

动态分区是相对静态分区的。

动态分区可以根据我们指定的某个字段的值,将数据动态写入对应的分区。

我们指定的字段中每有一个取值,就会生成一个分区。

建表语句示例:

create table ods.employee like ods.employee_tmp;
必配参数:
set hive.exec.dynamici.partition=true; --开启动态分区,默认是false 可配置参数:
set mapreduce.job.name=ods.ods_mysql_sale_sale_detail; --设置执行任务名称
set hive.merge.mapredfiles = true; --Map-Reduce的任务结束时合并小文件
set hive.exec.dynamic.partition.mode=nonstrict; --开启允许所有分区都是动态的,否则必须要有静态分区才能使用。
set hive.exec.max.dynamic.partitions.pernode=100000;--缺省值是100,指每个mapper或reducer可以创建的最大动态分区个数,如果某个mapper或者reducerchangshi 创建大于这个数目的分区,那么就会报错。
set hive.exec.max.dynamic.partitions =100000;--缺省值是+1000,指的是一个动态分区创建语句可以创建的最大分区数目,如果超过这个数目就会抛出一个致命错误。
set hive.exec.max.created.files =1000000; --缺省值是100000,全局 可以创建的最大文件个数。

tips:hive建表时,like关键字可以创建结构完全相同的表。

数据插入语句示例:

insert overwrite tableods.employee partition(province,city)
select
name,
salary,
subordinates,
deductions,
address,
province,
city
from ods.employee_tmp t

hive 会根据最后两个列,决定数据最终写入哪个分区中。

混合分区

了解了静态分区与动态分区。让我们学习下混合分区。

假设这样一种情况,我们使用了动态分区,一张表的某个字段的值,决定了另一张表的分区,

如果由于存在脏数据,或人为指定字段错误,就会在另一张表产生茫茫多的分区。

hive的分区数据也是元数据的一部分,由hdfs的namenode管理,hive启动后,会缓存在内存中。

一级分区过多会影响集群性能。

为了避免这种情况,就该使用混合分区。

混合分区的概念并不复杂,就是混合了动态分区和静态分区。且静态分区应该放到动态分区的前面。

插入数据时,第一级分区写死,第二级分区使用静态分区。这样就有效控制了由于分区过多,

导致文件名过多,影响hdfs性能的问题。

建表语句示例和动态分区一样,只是在数据插入时会体现出混合分区。

那么,看下数据插入语句:

insert overwrite tableods.employee partition(province='zhejiang',city)
select
name,
salary,
subordinates,
deductions,
address,
province,
city
from ods.employee_tmp t

代码的第一行体现了混合分区的用法。

多级分区

多级分区,其实我们在上面一直在使用。这里再提一下,
就是第一级分区下,增加第二级分区。对应hdfs就是嵌套的文件夹。

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

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

    各位看官,今天我们来讨论下再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. m0n0wall 详细介绍

    pfSense就是基于m0n0wall m0n0wall,挺奇怪的软件名, M0n0wall是基于以性能和稳定性著称的FreeBSD内核的嵌入式的防火墙系统. m0n0wall对硬件要求很低,486芯 ...

  2. iOS 3D Touch功能

    新的触摸体验——iOS9的3D Touch 一.引言 在iphone6s问世之后,很多果粉都争先要体验3D Touch给用户带来的额外维度上的交互,这个设计之所以叫做3D Touch,其原理上是增加了 ...

  3. 20172325 2018-2019-2 《Java程序设计》第四周学习总结

    20172325 2018-2019-2 <Java程序设计>第四周学习总结 教材学习内容总结 <Java软件结构与数据结构>第六章-列表 一.概述 1.列表是什么? 列表集合 ...

  4. redis在游戏服务器中的使用初探(三) 信息存储

    摘要: 搭建了服务器环境 有了客户端 我们来假想下以下应用场景:我们简单举个实例来描述下Hash的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:用户ID,为查找的key,存储的value ...

  5. apache反向代理设置

    为了方便在内网测试微信接口API <VirtualHost *:80> ServerName wx.abc.com ProxyPreserveHost on ProxyPass / htt ...

  6. linux系统,在centos7环境下安装jdk步骤

    记录一下安装jdk1.8版本的出错过程: 按照这个博客内容安装的,以及修改文件权限博客 [Linux]CentOS7下安装JDK详细过程 [Linux]目录文件权限的查看和修改[转] 1.安装的jdk ...

  7. Servet-------JSTL标签库

    JSTL标签库 也可以和EL表达式配合使用 作用:   提高在Jsp中的逻辑代码的编写效率,使用标签..(对EL表达式的扩展)   使用: JSTL的核心标签库(重点) JSTL的SQL标签库 JST ...

  8. JS将时间戳转化为时间

    //将时间戳转化为时间 function timestampToTime(timestamp) { var date = new Date(timestamp * 1000);//时间戳为10位需*1 ...

  9. join和split 的使用

    var abc = new Array(a,b,c,d,e); abc.join('-') // 结果 : a-b-c-d-e-f var obk = 'a-b-c-d-e'; obk.split(' ...

  10. TortoiseGit使用笔记

    不喜欢敲命令行,或者用惯TortoiseSVN的也可以使用TortoiseGit 1. TortoiseGit安装 安装很简单,默认安装就可以.需要安装以下几个软件: l Git-2.14.3-64- ...