[Hive]Hive静态分区与动态分区

4640人阅读 评论(0) 收藏 举报
分类:

1. 静态分区

若分区的值是确定的,那么称为静态分区。下面举例一个业务场景:

统计程序每天都需要统计1号店中由精准化推荐带来的销售额,日期是确定的,现在需要将每天统计好的销售额数据插入到指定的日期分区中

1.1. 实现方式

参见如下的脚本:

hive -e "
--设置Hive Job任务队列
set mapred.job.queue.name=pms;

--创建精准化销售额数据汇总表
create table if not exists pms.rpt_rcmd_gmv 
(
    page_name       string,
    section_name    string,
    order_count     bigint,
    order_amount    double
) 
PARTITIONED BY (ds string)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE;"

#----------------------------------------------

# 获取当天日期
date=`date +"%Y-%m-%d"`

hive -e "
--设置Hive Job任务队列
set mapred.job.queue.name=pms;

--将数据插入到指定的日期分区中
insert overwrite table pms.rpt_rcmd_gmv partition(ds='$date') 
select distinct 
    page_name,
    section_name,
    order_count,
    order_amount
from xxx;"

2. 动态分区

顾名思义,分区的值是非确定的,由输入数据来确定。下面举例一个业务场景:

一个二级类目对应着多个产品,现在想要按二级类目进行分区,问题在于输入数据中包含不止一个二级类目,所以分区的值是非确定的,需要根据输入数据来确定。

2.1. 实现方式

  1. 动态分区的字段,需要写在select语句中所有字段的最后
  2. hive需要设置set hive.exec.dynamic.partition=true;(默认值是false,表示是否开启动态分区)
  3. [可选]hive需要设置set hive.exec.dynamic.partition.mode=nonstrict;(默认是strict模式,表示至少需要指定一个静态分区;nonstrict模式表示不需要指定静态分区)

由于上述举例中的业务场景只需要动态设置二级类目分区,所以开启了以下模式:

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

完整的脚本如下:

--建立hive分区表,以二级类目id作为分区,字段之间以\t分隔,行之间以\n分隔
drop table if exists pms.dynamic_groupon;
create table if not exists pms.dynamic_groupon 
(
    product_id          bigint,
    area_id             string,
    type                int,
    original_price      double,
    price               double,
    start_time          string,
    end_time            string,
    groupon_num         int,
    ds                  string
) 
PARTITIONED BY (category_lvl2_id bigint) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE;

--根据query的结果,动态将数据插入到对应的二级类目分区中
set hive.exec.reducers.max=32;
set mapred.reduce.tasks=32;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set mapred.job.name=[HQL]dynamic_groupon;

insert overwrite table pms.dynamic_groupon partition(category_lvl2_id)
select 
    cast(a.productid as bigint) as product_id,
    a.areaid as area_id, 
    cast(a.type as int) as type,
    cast(a.originalprice as double) as original_price,
    cast(a.price as double) as price,
    a.start_time,
    a.end_time,
    cast(a.grouponnum as int) as groupon_num,
    a.ds,
    c.categ_lvl2_id as category_lvl2_id 
from pms.pms_all_groupon_items a 
left outer join product b on (cast(a.productid as bigint) = b.id)
left outer join (
    select distinct 
        categ_lvl_id,
        categ_lvl2_id 
    from dw.hier_categ_by_orig  
) c on (b.category_id = c.categ_lvl_id) 
where a.ds = '2015-10-18';

动态分区可以参考Hive Language Manual

查看评论

Hive分区

hive对表进行分区,如按照日期,城市等方式区分,可以起到提升查询速度的作用。 创建一个新的employee表,存储如下数据:id, name, dept 1 lllis tp ...
  • yidu_fanchen
  • yidu_fanchen
  • 2017年08月29日 17:27
  • 1449

hive partition 分区详解一

一.查看分区命令 1.show partitions xxx hive> show partitions xxx; OK day=20150908 day=20151020 day=20151021 ...
  • bitcarmanlee
  • bitcarmanlee
  • 2016年03月19日 22:42
  • 9454

hive分区表

hive分区表假设有海量的数据保存在hdfs的某一个hive表明对应的目录下,使用hive进行操作的时候,往往会搜索这个目录下的所有文件,这有时会非常的耗时,如果我们知道 这些数据的某些特征,可以事先...
  • u010521842
  • u010521842
  • 2017年07月17日 00:32
  • 834

Hive分区的概念

在使用sqoop进行Hive与关系数据库的导入导出时,在sqoop的命令中看到有对Hive分区进行指定的参数,之前对Hive了解并不够细致,今天就专门对Hive的分区和分桶两个概念进行的实验。 在正文...
  • CalicoBox
  • CalicoBox
  • 2017年07月24日 17:20
  • 402

hive分区(partition)简介

网上有篇关于hive的partition的使用讲解的比较好,转载了: 一、背景 1、在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关...
  • akon_vm
  • akon_vm
  • 2014年07月15日 21:37
  • 10920

02-Hive一个表创建另一个表,表分区,分桶

声明:如果你是初学者,看我这篇文章的时候,看我上一篇会更好。 Hive表的创建:http://blog.csdn.net/qq_29622761/article/details/51564680这篇...
  • qq_29622761
  • qq_29622761
  • 2016年06月02日 12:32
  • 9222

Hive分区partition详解

Hive分区partition详解
  • qq_36743482
  • qq_36743482
  • 2017年11月01日 20:57
  • 662

hive创建分区表

hive创建分区表
  • high2011
  • high2011
  • 2016年09月18日 13:45
  • 11231

在Hive中如何实现数据分区

Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成更小的数据集。那么在Hive中如何进行数据分区呢?分区时应该注意什么样的问题呢?它的分区数如何进行限制呢?...
  • jishuxiaozi
  • jishuxiaozi
  • 2017年01月16日 17:49
  • 985

Hive数据加载(内部表,外部表,分区表)

内表数据加载创建表时加载create table newtable as select col1,col2 from oldtablehive> create table testNew as sel...
  • scgaliguodong123_
  • scgaliguodong123_
  • 2015年07月17日 21:49
  • 11635
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 45万+
    积分: 6174
    排名: 5030
    第三方账号
    博客专栏