Hive中的分区表

来源:互联网 发布:Linux命令如何更换壁纸 编辑:程序博客网 时间:2024/05/29 11:04

下午闲来无事,看了一下好久没有操作的分区表。代码这东西,长时间不写就容易生疏。

分区表是Hive的数据表中很重要的一种类型,在实际开发中应用很广,但是,由于其语法较为灵活,实际Coding时很容易出错。

于是,我将分区表的一些操作总结如下。


1、创建分区表t1,有id、day两个字段,其中day为分区字段
 create table t1 (id int) partitioned by (day int);
2、将Linux本地文件中的数据加载到分区表中
 load data local inpath '/home/tg/datas/f1' into table t1 partition (day=1);
3、创建一张外部表
create external table sogou (
time string,
uid string,
kw string,
rank int,
orders int,
url string
)
row format delimited
fields terminated by '\t'
location '/in/sogou';
4、加载数据到外部表sogou
load data local inpath '/home/tg/sogou.500w.utf8' into table sogou;
5、从sogou中查询5条rank数据,并将其插入到day=2的分区中
insert into table t1 partition(day=2) select rank from sogou limit 5;
6、从sogou表中查询rank=2和rank=3的数据,并将其分别插入到day=2和day=3的分区中
from sogou
insert overwrite table t1 partition(day=2) select rank where rank=2
insert overwrite table t1 partition(day=3) select rank where rank=3;
7、动态分区插入
所谓动态分区,指的是插入到目标表时,不指定分区值,仅指定分区字段;
分区值是从原始表中取得的。这就是动态指定分区,称作动态分区插入。
默认,Hive是支持动态分区插入的。
//允许动态分区
set hive.exec.dynamic.partition=true;  
//在strict模式下,用户必须指定至少一个静态分区。关闭是nonstrict
sethive.exec.dynamic.partition.mode=nonstrict;
//每个mapper或者reducer可以创建的最大动态分区个数。
set hive.exec.max.dynamic.partitions.pernode=1000;


从sogou中查询10条orders、rank,并将其插入到t1表中
insert overwrite table t1 partition(day)
select orders, rank as day from sogou limit 10;
下面是查询语句的结果:
1 1
1 3
1 1
1 1
1 2
1 1
1 1
1 1
1 1
1 1


又创建了另一张分区表t2,此表有两个分区字段day、name
create table t2 (orders int) partitioned by(rank int,uid string);
从sogou中查询10条orders,rank as day,uid as name,并将其插入到t2表中
insert overwrite table t2 partition(rank,uid)
select orders,rank,uid from sogou;
显示t2表中的分区
show partitions t2;

8、总结:
使用from .. insert.. select ..where结构能够从一个数据表中抽取数据,
将结果插入到不同的表和分区中,
而使用动态分区能够让hive根据select最末几个位置的值自动设定目标分区的值,
使用动态分区需要设定一些hive运行参数。

0 0
原创粉丝点击