Hive静态分区和动态分区

一、静态分区
1、创建分区表

1 hive (default)> create table order_mulit_partition(
2               > order_number string,
3               > event_time string
4               > )
5               > PARTITIONED BY(event_month string, step string)
6               > row format delimited fields terminated by ‘\t‘;

2、加载数据到分区表

1 load data local inpath ‘/opt/data/order_created.txt‘ overwrite into table order_mulit_partition PARTITION(event_month=‘201405‘, step=‘1‘);

order_created.txt内容如下

1  order_number           event_time
2 10703007267488  2014-05-01 06:01:12.334+01
3 10101043505096  2014-05-01 07:28:12.342+01
4 10103043509747  2014-05-01 07:50:12.33+01
5 10103043501575  2014-05-01 09:27:12.33+01
6 10104043514061  2014-05-01 09:03:12.324+01

3、这种手动指定分区加载数据,就是常说的静态分区的使用。但是在日常工作中用的比较多的是动态分区。

二、动态分区
需求:按照不同部门作为分区导数据到目标表
以上需求如果用静态分区的话,数据量大你是不是很懵逼??所以这个需求一般采用动态分区来实现。
1、创建目标表

 1 hive (default)> create table emp_dynamic_partition(
 2               > empno int,
 3               > ename string,
 4               > job string,
 5               > mgr int,
 6               > hiredate string,
 7               > sal double,
 8               > comm double)
 9               > PARTITIONED BY(deptno int)
10               > row format delimited fields terminated by ‘\t‘;

2、采用动态方式加载数据到目标表
加载之前先设置一下下面的参数

1 hive (default)> set hive.exec.dynamic.partition.mode=nonstrict

开始加载

1 insert into table emp_dynamic_partition partition(deptno)
2 select empno , ename , job , mgr , hiredate , sal , comm, deptno from emp;

上面加载数据方式并没有指定具体的分区,只是指出了分区字段。在select最后一个字段必须跟你的分区字段,这样就会自行根据deptno的value来分区。

3、验证一下
有值

 1 hive (default)> select * from emp_dynamic_partition;
 2 OK
 3 emp_dynamic_partition.empno     emp_dynamic_partition.ename     emp_dynamic_partition.job       emp_dynamic_partition.mgr       emp_dynamic_partition.hiredate     emp_dynamic_partition.sal       emp_dynamic_partition.comm      emp_dynamic_partition.deptno
 4 7782    CLARK   MANAGER 7839    1981-6-9        2450.0  NULL    10
 5 7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10
 6 7934    MILLER  CLERK   7782    1982-1-23       1300.0  NULL    10
 7 7369    SMITH   CLERK   7902    1980-12-17      800.0   NULL    20
 8 7566    JONES   MANAGER 7839    1981-4-2        2975.0  NULL    20
 9 7788    SCOTT   ANALYST 7566    1987-4-19       3000.0  NULL    20
10 7876    ADAMS   CLERK   7788    1987-5-23       1100.0  NULL    20
11 7902    FORD    ANALYST 7566    1981-12-3       3000.0  NULL    20
12 7499    ALLEN   SALESMAN        7698    1981-2-20       1600.0  300.0   30
13 7521    WARD    SALESMAN        7698    1981-2-22       1250.0  500.0   30
14 7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30
15 7698    BLAKE   MANAGER 7839    1981-5-1        2850.0  NULL    30
16 7844    TURNER  SALESMAN        7698    1981-9-8        1500.0  0.0     30
17 7900    JAMES   CLERK   7698    1981-12-3       950.0   NULL    30
18 8888    HIVE    PROGRAM 7839    1988-1-23       10300.0 NULL    NULL

有分区(自动分区)

1 hive (default)> show partitions emp_dynamic_partition;
2 OK
3 partition
4 deptno=10
5 deptno=20
6 deptno=30
7 deptno=__HIVE_DEFAULT_PARTITION__
8 Time taken: 0.29 seconds, Fetched: 4 row(s)

4、emp表的具体你内容如下

 1 hive (default)> select * from emp;
 2 OK
 3 emp.empno       emp.ename       emp.job emp.mgr emp.hiredate    emp.sal emp.comm        emp.deptno
 4 7369    SMITH   CLERK   7902    1980-12-17      800.0   NULL    20
 5 7499    ALLEN   SALESMAN        7698    1981-2-20       1600.0  300.0   30
 6 7521    WARD    SALESMAN        7698    1981-2-22       1250.0  500.0   30
 7 7566    JONES   MANAGER 7839    1981-4-2        2975.0  NULL    20
 8 7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30
 9 7698    BLAKE   MANAGER 7839    1981-5-1        2850.0  NULL    30
10 7782    CLARK   MANAGER 7839    1981-6-9        2450.0  NULL    10
11 7788    SCOTT   ANALYST 7566    1987-4-19       3000.0  NULL    20
12 7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10
13 7844    TURNER  SALESMAN        7698    1981-9-8        1500.0  0.0     30
14 7876    ADAMS   CLERK   7788    1987-5-23       1100.0  NULL    20
15 7900    JAMES   CLERK   7698    1981-12-3       950.0   NULL    30
16 7902    FORD    ANALYST 7566    1981-12-3       3000.0  NULL    20
17 7934    MILLER  CLERK   7782    1982-1-23       1300.0  NULL    10
18 8888    HIVE    PROGRAM 7839    1988-1-23       10300.0 NULL    NULL
 

--------------------- 本文来自 A_ChunUnique 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/Gavin_chun/article/details/78174492

原文地址:https://www.cnblogs.com/shujuxiong/p/9712907.html

时间: 2024-10-12 15:23:09

Hive静态分区和动态分区的相关文章

Hive的静态分区和动态分区

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

Hive架构层面优化之五合理设计表分区(静态分区和动态分区)

合理建表分区有效提高查询速度. 重要数据采用外部表存储,CREATE EXTERNAL TABLE,数据和表只是一个location的关联,drop表后数据不会丢失: 内部表也叫托管表,drop表后数据丢失:所以重要数据的表不能采用内部表的方式存储. 在全天的数据里查询某个时段的数据,性能很低效------可以通过增加小时级别的分区来改进! Trackreal为例,有三个分区: 日增量: 按日期分区: 小时增量:按日期.小时分区: 10分钟增量:按日期.小时.step分区:每个小时要导6次. 场

hive 1.1.0 动态分区实现

hive (public)> explain insert overwrite table public_t_par partition(delivery_datekey) select * from public_oi_fact_partition; OK STAGE DEPENDENCIES: Stage-1 is a root stage Stage-7 depends on stages: Stage-1 , consists of Stage-4, Stage-3, Stage-5 S

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

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

Hive动态分区

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

HIVE动态分区实战

一)hive中支持两种类型的分区: 静态分区SP(static partition) 动态分区DP(dynamic partition) 静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断.详细来说,静态分区的列实在编译时期,通过用户传递来决定的:动态分区只有在SQL执行时才能决定. 二)实战演示如何在hive中使用动态分区 1.创建一张分区表,包含两个分区dt和ht表示日期和小时 CREATE TABLE partition_table001 ( name ST

hive-- 请不要用动态分区(如果分区可以确定)

如果分区是可以确定的话,千万不要用动态分区,动态分区的值是在reduce运行阶段确定的.也就是会把所有的记录distribute by. 可想而知表记录非常大的话,只有一个reduce 去处理,那简直是疯狂的.如果这个值唯一或者事先已经知道,比如按天分区(i_date=20140819) 那就用静态分区吧.静态分区在编译阶段已经确定,不需要reduce处理. 例如以下两个insert 表分区: 1.插入动态分区: set hive.exec.dynamic.partition.mode=stri

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 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