博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hive分区partition详解
阅读量:4186 次
发布时间:2019-05-26

本文共 3971 字,大约阅读时间需要 13 分钟。

Hive分区更方便于数据管理,常见的有时间分区和业务分区。

 

一、单分区操作

1.创建分区表

create table t1(    id      int   ,name    string   ,hobby   array
,add map
)partitioned by (pt_d string)row format delimitedfields terminated by ','collection items terminated by '-'map keys terminated by ':';

注:这里分区字段不能和表中的字段重复。如果分区字段和表中字段相同的话,会报错,如下:

create table t1(    id      int   ,name    string   ,hobby   array
,add map
)partitioned by (id int)row format delimitedfields terminated by ','collection items terminated by '-'map keys terminated by ':';

报错信息:FAILED: SemanticException [Error 10035]: Column repeated in partitioning columns

这里写图片描述

2.装载数据

需要装载的文件内容如下:

1,xiaoming,book-TV-code,beijing:chaoyang-shagnhai:pudong2,lilei,book-code,nanjing:jiangning-taiwan:taibei3,lihua,music-book,heilongjiang:haerbin

执行load data

load data local inpath '/home/hadoop/Desktop/data' overwrite into table t1 partition ( pt_d = '201701');
  • 3.查看数据及分区

查看数据

select * from t1;

结果

1   xiaoming    ["book","TV","code"]    {"beijing":"chaoyang","shagnhai":"pudong"}  2017012   lilei   ["book","code"] {"nanjing":"jiangning","taiwan":"taibei"}   2017013   lihua   ["music","book"]    {"heilongjiang":"haerbin"}  201701

查看分区

show partitions t1;

插入另一个分区

在创建一份数据并装载,分区=‘000000’

load data local inpath '/home/hadoop/Desktop/data' overwrite into table t1 partition ( pt_d = '000000');

查看数据:select * from t1;

1   xiaoming    ["book","TV","code"]    {"beijing":"chaoyang","shagnhai":"pudong"}  0000002   lilei   ["book","code"] {"nanjing":"jiangning","taiwan":"taibei"}   0000003   lihua   ["music","book"]    {"heilongjiang":"haerbin"}  0000001   xiaoming    ["book","TV","code"]    {"beijing":"chaoyang","shagnhai":"pudong"}  2017012   lilei   ["book","code"] {"nanjing":"jiangning","taiwan":"taibei"}   2017013   lihua   ["music","book"]    {"heilongjiang":"haerbin"}  201701

观察HDFS上的文件

去hdfs上看文件,可以看到,文件是根据分区分别存储

这里写图片描述

查询相应分区的数据

select * from t1 where pt_d = ‘000000’

添加分区,增加一个分区文件

alter table t1 add partition (pt_d = ‘333333’);
这里写图片描述

删除分区(删除相应分区文件)

注意,对于外表进行drop partition并不会删除hdfs上的文件,并且通过msck repair table table_name同步回hdfs上的分区。
alter table test1 drop partition (pt_d = ‘20170101’);

二、多个分区操作

创建分区表

create table t10(    id      int   ,name    string   ,hobby   array
,add map
)partitioned by (pt_d string,sex string)row format delimitedfields terminated by ','collection items terminated by '-'map keys terminated by ':';

装载数据(分区字段必须都要加)

load data local inpath ‘/home/hadoop/Desktop/data’ overwrite into table t10 partition ( pt_d = ‘0’);
如果只是添加一个,会报错:FAILED: SemanticException [Error 10006]: Line 1:88 Partition not found ”0”

load data local inpath '/home/hadoop/Desktop/data' overwrite into table t10 partition ( pt_d = '0',sex='male');load data local inpath '/home/hadoop/Desktop/data' overwrite into table t10 partition ( pt_d = '0',sex='female');
  • 观察HDFS上的文件,可发现多个分区具有顺序性,可以理解为windows的树状文件夹结构。

这里写图片描述

这里写图片描述

表分区的增删修查

增加分区

这里我们创建一个分区外部表

create external table testljb(id int) partitioned by (age int);

添加分区,官网说明:

ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec [LOCATION 'location'][, PARTITION partition_spec [LOCATION 'location'], ...];partition_spec:  : (partition_column = partition_col_value, partition_column = partition_col_value, ...)

实例说明

  • 一次增加一个分区
alter table testljb add partition (age=2);
  • 一次增加多个分区
alter table testljb add partition(age=3) partition(age=4);

注意:一定不能写成如下方式:

alter table testljb add partition(age=5,age=6);

如果我们show partitions table_name 会发现仅仅添加了age=6的分区。

这里写图片描述

这里猜测原因:因为这种写法实际上:具有多个分区字段表的分区添加,而我们写两次同一个字段,而系统中并没有两个age分区字段,那么就会随机添加其中一个分区。举个例子,有个表具有两个分区字段:age分区和sex分区。那么我们添加一个age分区为1,sex分区为male的数据,可以这样添加:

alter table testljb add partition(age=1,sex='male');

删除分区

删除分区age=1

alter table testljb drop partition(age=1);

注:加入表testljb有两个分区字段(上文已经提到多个分区先后顺序类似于windows的文件夹的树状结构),partitioned by(age int ,sex string),那么我们删除age分区(第一个分区)时,会把该分区及其下面包含的所有sex分区一起删掉。

修复分区

修复分区就是重新同步hdfs上的分区信息。

msck repair table table_name;

查询分区

show partitions table_name;
你可能感兴趣的文章
程序员准时下班碰见领导,次月发工资时看到绩效莫名被扣20%
查看>>
程序员的月薪决定了对老板的态度:月薪50万,我与公司共存亡
查看>>
你见过最牛逼的程序员是什么样的?拳打回车键,脚踩Emacs编辑器
查看>>
相比加班的程序员,企业更喜欢“偷懒”的程序员?程序员偷的不是懒,是高效!
查看>>
初学Java必备基础知识,编程领域你需要掌握的关键点!
查看>>
阿里五年Java程序员的总结,献给还在迷茫中的你!
查看>>
程序员身上有异味,同事为什么都不会直接告诉他?
查看>>
大数据折射算法“歧视”?王思聪微博抽奖113位,仅有一位男性
查看>>
Java、C、C+ +、PHP、Python分别用来开发什么?一篇文章告诉你!
查看>>
Linux-ACL权限介绍
查看>>
Linux -文件系统
查看>>
Linux常用命令-进程管理
查看>>
Linux - 定时任务
查看>>
Linux - SHELL基础
查看>>
Linux-SHELL基础语法
查看>>
Linux-SHELL变量
查看>>
Linux-SHELL常用命令
查看>>
Linux-网络运维基础
查看>>
Linux网络运维-SSH
查看>>
Linux网络运维 -- 配置DHCP服务器
查看>>