hive动态分区总结

一:hive引入静态分区的意义

目前主流离线数据仓库都在使用hive,最初由谷歌工程师开发,后面贡献给apache。使我们在处理大数据时,需要写大量的map/reduce程序当中解脱出来,只需要使用简单易于理解的hive sql就可以了,这使得大数据的离线处理变得简单易上手,并且更好维护。要理解hive引入分区的含义,得要了解hive框架的结构图,其实hive只是一个负责解析hive sql的框架,底层一般使用HDFS来进行存储操作(当时也可以使用其他的,详情参考官网hive hbase集成Hive Accumulo集成)。hive的元数据默认是存储在derby数据库上,但是一般都会修改成mysql来进行存储。hive引入分区最主要的原因是可以实现在海量数据当中快速检索到需要的数据。分区表对应的HDFS上的目录跟非分区表有一点区别,主要是体现在#{hive库表目录}/根分区名/叶子分区名,hive支持多级分级,分区层级越多,相对来说,HDFS的目录就越深。对分区表进行筛选数据时只要指定分区,程序就能解析并映射到对应的目录文件,而不需要全文检索,大大加快了检索的速度。当然hive分区在数据相关工程方面也有着其意义,目前企业级的数据仓库都是会按照分区来维护数据表,比如根据天/小时等。

二:hive引入动态分区的意义以及如何使用

动态分区较之静态分区,主要是为了解决在某种场景下需要从子表抽取大量带分区的数据到另外一张表,如果没有动态分区,可能需要像如下这样操作(引用于hive官网):

INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country='US')
       SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip WHERE pvs.country = 'US'
INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country='CA')
       SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip WHERE pvs.country = 'CA'
INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country='UK')
       SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip WHERE pvs.country = 'UK';

在前面的示例中,用户必须知道要插入哪个分区,并且在一个插入语句中只能插入一个分区。如果要加载到多个分区,则必须使用多插入语句。如果分区数非常多的话,那将是非常繁琐的,并且还有非常不是想发生的一点是:一条hive sql语句,就独立解析成一个job,伴随着大量的map/reduce程序,如果这样操作的话,会带来较大的性能开销。

如果使用动态分区的话,需要像如下这样操作:

INSERT OVERWRITE TABLE page_view PARTITION(dt='2008-06-08', country)
       SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, null, null, pvs.ip, pvs.country

这种方式大大的提高的用户写hive sql的效率,并且也提高了执行的效率。如上图所示并非是全动态分区,根分区为静态分区,叶子分区为动态分区,需要注意的是,静态分区其关联的值必须要partition当中指定好,而动态分区的值根据hive在执行过程当中获取动态分区列的值来动态产生分区。当然也可以实现全动态分区,道理是一样的。

三:动态分区使用注意事项

1.hive支持全动态分区,但是在使用前必须设置以下参数:

set hive.exec.dynamic.partition=true --表示开启全动态分区
set hive.exec.dynamic.partition.mode=nostrict --默认是strict(严格模式,必须至少包含一个静态分区)

2.如果是非全动态分区,必须要将静态分区放在根分区,拿page_view举例,不允许partition(dt,country ='US')这样写。

3.当动态分区列中已经存在非空分区时(例如,在某些dt根分区下存在country ='CA'),如果动态分区插入看到相同的值(例如'CA'),它将被覆盖。)输入数据中。这符合“插入覆盖”的语义。但是,如果分区值“ CA”未出现在输入数据中,则现有分区将不会被覆盖。

4.由于Hive分区对应于HDFS中的目录,因此分区值必须符合HDFS路径格式(Java中的URI)。URI中具有特殊含义的任何字符(例如'%',':','/','#')都将以'%'进行转义,后跟2个字节的ASCII值。

5.如果输入列的类型不同于STRING,则其值将首先转换为STRING,以用于构造HDFS路径。

6.如果输入列的值为NULL或空字符串,则该行将放入一个特殊分区,其名称由配置单元参数hive.exec.default.partition.name控制。

7:动态分区插入可能会占用大量资源,因为它可能会在短时间内生成大量分区。为了使自己安全,我们定义了三个参数:
hive.exec.max.dynamic.partitions.pernode(默认值为100)是每个映射器或化简器可以创建的最大动态分区。如果一个映射器或缩减器创建的阈值多于该阈值,则会从映射器/缩减器中引发致命错误(通过计数器),并且整个工作将被杀死。
hive.exec.max.dynamic.partitions(默认值为1000)是一个DML可以创建的动态分区的总数。如果每个映射器/缩减器未超过限制,但动态分区的总数未超过限制,则在作业结束时会引发异常,然后才将中间数据移至最终目标。
hive.exec.max.created.files(默认值为100000)是所有映射器和化简器创建的最大文件总数。每当创建新文件时,每个映射器/缩减器都会更新Hadoop计数器,从而实现此目的。如果总数超过hive.exec.max.created.files,将引发致命错误并杀死作业。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • hive.ddl.output.format:hive的ddl语句的输出格式,默认是text,纯文本,还有json...
    博弈史密斯阅读 1,943评论 0 6
  • Zookeeper用于集群主备切换。 YARN让集群具备更好的扩展性。 Spark没有存储能力。 Spark的Ma...
    Yobhel阅读 7,263评论 0 34
  • Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。本...
    felix521阅读 1,303评论 0 0
  • Hive总结 一、Hive架构 1.架构图 2.Hive架构解析 1)用户接口 CLI:cli即shell命令。C...
    农民2019阅读 1,165评论 0 1
  • 看过太多刘涛主演的古装剧,都太经典,也太深刻。如今一提起刘涛就能在脑海中浮现出曾经被她塑造过的那一个个经典的古装角...
    小文哪里走阅读 445评论 0 0