HIVE动态分区实战

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

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

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

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

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

CREATE TABLE partition_table001
(
    name STRING,
    ip STRING
)
PARTITIONED BY (dt STRING, ht STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY "\t";

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

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

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

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

create table if not exists partition_table002 like partition_table001;
insert overwrite table partition_table002 partition (dt='20150617', ht='00') select name, ip from partition_table001 where dt='20150617' and ht='00';

此时我们发现一个问题,如果希望插入每天24小时的数据,则需要执行24次上面的语句。而动态分区会根据select出的结果自动判断数据改load到哪个分区中去。

4、使用动态分区

insert overwrite table partition_table002 partition (dt, ht) select * from partition_table001 where dt='20150617';

hive先获取select的最后两个位置的dt和ht参数值,然后将这两个值填写到insert语句partition中的两个dt和ht变量中,即动态分区是通过位置来对应分区值的。原始表select出来的值和输出partition的值的关系仅仅是通过位置来确定的,和名字并没有关系,比如这里dt和st的名称完全没有关系。

只需要一句SQL即可把20150617下的24个ht分区插到了新表中。

三)静态分区和动态分区可以混合使用

1、全部DP

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

2、DP/SP结合

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

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

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

4、多张表插入

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

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

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

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

四)小结:

通过上面的案例,我们能够发现使用hive中的动态分区特性的最佳实践:对于那些存在很大数量的二级分区的表,使用动态分区可以非常智能的加载表,而在动静结合使用时需要注意静态分区值必须在动态分区值的前面

时间: 2024-10-17 23:32:39

HIVE动态分区实战的相关文章

hive 动态分区与混合分区

使用hive分区,可以在查询的只查询对应分区的数据,避免了全表扫描.大大提升了查询速度. 今天我们讨论下,hive分区中的两个用法,动态分区和混合分区. hive混合分区 就是多级分区.在某个分区下继续创建分区. 比如 分区 dt=2019-03-10的fruit销售表中,继续区分apple,orange,banana的销售数据. 我们经常分开统计 各种水果的销售情况,那么使用混合分区就非常合适.    代码: 混合分区建表语句: hive动态分区: 根据指定字段,hive自动生成分区. 原文地

Hive动态分区

Hive默认是静态分区,我们在插入数据的时候要手动设置分区,如果源数据量很大的时候,那么针对一个分区就要写一个insert,比如说,我们有很多日志数据,我们要按日期作为分区字段,在插入数据的时候我们不可能手动的去添加分区,那样太麻烦了.还好,Hive提供了动态分区,动态分区简化了我们插入数据时的繁琐操作. 使用动态分区的时候必须开启动态分区(动态分区默认是关闭的),语句如下: [java] view plain copy set hive.exec.hynamic.partition=true;

hive 动态分区

非常重要的动态分区属性: hive.exec.dynamic.partition  是否启动动态分区.false(不开启) true(开启)默认是 false hive.exec.dynamic.partition.mode  打开动态分区后,动态分区的模式,有 strict和 nonstrict 两个值可选,strict 要求至少包含一个静态分区列,nonstrict则无此要求.各自的好处,大家自己查看哈. hive.exec.max.dynamic.partitions 允许的最大的动态分区

大数据--hive动态分区调整

1.创建一张普通表加载数据 ------------------------------------------------ hive (default)> create table person(id int,name string,location string) > row format delimited fields terminated by '\t';OKTime taken: 0.415 seconds -------------------------------------

Hive学习之动态分区及HQL

Hive动态分区 1.首先创建一个分区表create table t10(name string) partitioned by(dt string,value string)row format delimited fields terminatedby '\t' lines terminated by '\n'stored as textfile;2.然后对hive进行设置,使之支持动态分区,set hive.exec.dynamic.partition.mode=nonstrict;如果限

hive从查询中获取数据插入到表或动态分区

(前人写的不错,很实用,负责任转发)转自:http://www.crazyant.net/1197.html Hive的insert语句能够从查询语句中获取数据,并同时将数据Load到目标表中.现在假定有一个已有数据的表staged_employees(雇员信息全量表),所属国家cnty和所属州st是该表的两个属性,我们做个试验将该表中的数据查询出来插入到另一个表employees中. 1 2 3 4 INSERT OVERWRITE TABLE employees PARTITION (cou

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

Hive分区的概念与传统关系型数据库分区不同. 传统数据库的分区方式:就oracle而言,分区独立存在于段里,里面存储真实的数据,在数据进行插入的时候自动分配分区. Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段. 所以可以这样理解,当我们在插入数据的时候指定分区,其实就是新建一个目录或者子目录,或者在原有的目录上添加数据文件. Hive分区的创建 Hive分区是在创建表的时候用Partitioned b

Hive的静态分区和动态分区

作者:Syn良子 出处:http://www.cnblogs.com/cssdongl/p/6831884.html 转载请注明出处 虽然之前已经用过很多次hive的分区表,但是还是找时间快速回顾总结一下加深理解. 举个栗子,基本需求就是Hive有一张非常详细的原子数据表original_device_open,而且还在不断随着时间增长,那么我需要给它进行分区,为什么要分区?因为我想缩小查询范围,提高速度和性能. 分区其实是物理上对hdfs不同目录进行数据的load操作,0.7之后的版本都会自动

Hive Experiment 2(表动态分区和IDE)

1.使用oracle sql developer 4.0.3作为hive query的IDE. 下载hive-jdbc driver http://www.cloudera.com/content/cloudera/en/downloads/connectors/hive/jdbc/hive-jdbc-v2-5-6.html Start    Oracle    SQL    Developer    and    navigate    to    Preferences    |    Da