Hive Partitioning

Hive 分区是一项特别强大的功能,通过分区可以将一个表划分为更多的 pieces(实际上一个分区物理上对应 HDFS 一个目录),从而可以以更细的粒度对数据进行管理和访问。

分区的优点如下:

  • 分区也有助于查询性能的提升,我们可以直接查询某个分区的数据,避免了对表中的全量数据进行扫描。
  • 借助分区,可以减少诸如 mapper 的数量,I/O 操作等系统资源。

分区的种类

分区可以进一步分为 静态分区动态分区

分区表的创建语法:

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] 
  [db_name.]table_name
  [(col_name data_type [column_constraint_specification] [COMMENT col_comment],
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)];

静态分区

静态分区需要明确指定向哪个分区写入。静态分区是可以 alter 的。
使用静态分区特性需要在 hive-site.xml 中设置属性 hive. mapred.mode = strict
通过以下例子感受一下静态分区。

  • 创建表
CREATE TABLE user_data (
user_id INT,
user_name string,
site_data string
) PARTITIONED BY (
date_dt string,
country string
);
create-table.png
  • 插入数据
INSERT INTO TABLE user_data PARTITION(date_dt='2016-05-29', country='US') VALUES(201, 'Wick', 'Google');
INSERT INTO TABLE user_data PARTITION(date_dt='2016-05-20', country='UK') VALUES(202, 'John', 'Facebook');
INSERT INTO TABLE user_data PARTITION(date_dt='2016-05-20', country='UK') VALUES(203, 'Partick', 'Instagram');
INSERT INTO TABLE user_data PARTITION(date_dt='2016-05-29', country='UK') VALUES(204, 'Hema', 'Google');
INSERT INTO TABLE user_data PARTITION(date_dt='2016-05-28', country='INDIA') VALUES(205, 'Holi', 'Facebook');
INSERT INTO TABLE user_data PARTITION(date_dt='2016-05-20', country='RUSSIA') VALUES(206, 'Michael', 'Insatgram');
INSERT INTO TABLE user_data PARTITION(date_dt='2016-05-20', country='RUSSIA') VALUES(207, 'Chung', 'Instagram');
INSERT INTO TABLE user_data PARTITION(date_dt='2016-05-22', country='NEPAL') VALUES(208, 'Anna', 'Instagram');
show-partitions.png

默认情况下,表会创建在 HDFS 的 /user/hive/warehouse 路径(本例指定创建位置为 /user/spark/spark-sql-warehouse)。

由于我们的分区列为 date_dt 和 country 两列,相应的,可以在 HDFS 看到 user_data 的数据为以 date_dt 的取值作为第一级目录,country 的取值作为第二级目录进行存储。

hdfs-ls-1.png
hdfs-ls-2.png

动态分区

动态分区可以自动识别分区,不需要明确指定分区。例如,如果数据已经存储在一个非分区的表中,现在需要将数据转储到一个分区表中,此时动态分区比较适合。
动态分区比静态分区更加耗时,且分区不可修改
使用动态分区特性需要在 hive-site.xml 中设置属性 hive.exec.dynamic.partition.mode= nonstrict

通过以下例子感受一下动态分区:

准备两个表,user_data_dyn 和 user_log_data。user_data_dyn 是分区表,以 date_dt 列和 country 列作为分区列。user_log_data 为非分区表,接下来将数据从非分区表 user_log_data 转储到分区表 user_data_dyn 中。

  • 创建表非分区表 user_log_data
CREATE TABLE user_log_data (
user_id int,
user_name string,
site_data string,
date_dt string,
country string
);
  • 向 user_log_data 中插入测试数据
INSERT INTO TABLE user_log_data VALUES(1001, 'John', 'Google', '2016-04-27', 'US');
INSERT INTO TABLE user_log_data VALUES(1002, 'Eric', 'Facebook', '2016-04-28', 'US');
INSERT INTO TABLE user_log_data VALUES(1003, 'Annie', 'Instagram', '2016-04-28', 'UK');
INSERT INTO TABLE user_log_data VALUES(1005, 'Ming', 'Google', '2016-04-29', 'CHINA');
INSERT INTO TABLE user_log_data VALUES(1006, 'Li', 'Facebook', '2016-04-29', 'CHINA');
INSERT INTO TABLE user_log_data VALUES(1007, 'Sota', 'Insatgram', '2016-04-29', 'JAPAN');
INSERT INTO TABLE user_log_data VALUES(1008, 'Yuto', 'Instagram', '2016-04-27', 'JAPAN');
INSERT INTO TABLE user_log_data VALUES(1009, 'Anna', 'Instagram', '2016-04-28', 'AUSTRALIA');
INSERT INTO TABLE user_log_data VALUES(1010, 'Ricky', 'Facebook', '2016-04-28', 'AUSTRALIA');
  • 创建分区表 user_data_dyn
CREATE TABLE user_data_dyn (
user_id int,
user_name string,
site_data string
) PARTITIONED BY (
date_dt string,
country string
);
  • 将数据从 user_log_data 转储到 user_data_dyn
SET hive.exec.dynamic.partition = true;
SET hive.exec.dynamic.partition.mode = nonstrict; 

INSERT OVERWRITE TABLE user_data_dyn
PARTITION(date_dt, country)
SELECT user_id, user_name, site_data, date_dt, country FROM user_log_data; 

可以看到动态分区已经基于 date_dt 和 country 自动创建:

dynamic-partitions.png
  • 分区删除

对 user_data_dyn 中的分区执行删除操作,感受一下分区的便捷。不知道为什么,就想删掉那个叫 JAPAN 的 country:

alter table user_data_dyn drop partition (date_dt='2016-04-27', country='JAPAN');
drop-partitions.png

最后对 静态分区 和 动态分区 做一下对比:

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

推荐阅读更多精彩内容