文档章节

Hive 分区表总结

Avner
 Avner
发布于 2017/08/10 15:49
字数 1566
阅读 20
收藏 0
点赞 0
评论 0

 本文大部分内容转至:http://blog.csdn.net/u010330043/article/details/51277868

Hive 的分区通过在创建表时启动 PARTITION BY 实现,用来分区的维度并不是实际数据的某一列,具体分区的标志是由插入内容时给定的。当要查询某一分区的内容时可以采用 WHERE 语句, 例如使用 “WHERE tablename.partition_key>a” 创建含分区的表。创建分区语法如下。

CREATE TABLE table_name(
...
)
PARTITION BY (dt STRING,country STRING)

1、 创建分区

  Hive 中创建分区表没有什么复杂的分区类型(范围分区、列表分区、hash 分区,混合分区等)。分区列也不是表中的一个实际的字段,而是一个或者多个伪列。意思是说,在表的数据文件中实际并不保存分区列的信息与数据。 

  • 需要注意,Partitioned by子句中的列定义是表中正式的列,称为“分区列”partition column。
  • 但是,数据文件并不包含这些列的值,因为他们源于目录名。

创建一个简单的分区表。

hive> create table partition_test
(member_id string,
 name string
) 
partitioned by (stat_date string,province string) 
row format delimited 
fields terminated by ',';

这个例子中创建了 stat_date 和 province 两个字段作为分区列。通常情况下需要预先创建好分区,然后才能使用该分区。例如:

hive> alter table partition_test add partition (stat_date='2016-04-28',province='beijing');

这样就创建了一个分区。这时会看到 Hive 在HDFS 存储中创建了一个相应的文件夹。

$ hadoop fs -ls /user/hive/warehouse/partition_test/stat_date=2015-01-18
/user/hive/warehouse/partition_test/stat_date=2016-04-28/province=beijing ----显示刚刚创建的分区

每一个分区都会有一个独立的文件夹,在这个例子中stat_date是主层次,province是副层次,

所有stat_date='20150118',而province不同的分区都会在

/user/hive/warehouse/partition_test/stat_date=20110728 下面,

而stat_date不同的分区都会在

/user/hive/warehouse/partition_test/ 下面;
如:$ hadoop fs -ls /user/hive/warehouse/partition_test/
        Found 2 items
drwxr-xr-x - admin supergroup 0 2015-01-28 19:46
 /user/hive/warehouse/partition_test/stat_date=20150126
drwxr-xr-x - admin supergroup 0 2015-01-29 09:53
 /user/hive/warehouse/partition_test/stat_date=20150128

注意,因为分区列的值要转化为文件夹的存储路径,所以如果分区列的值中包含特殊值,如 '%', ':', '/', '#',它将会被使用%加上2字节的ASCII码进行转义,如:

hive> alter table partition_test add partition (stat_date='2011/07/28',province='zhejiang');
      OK
      Time taken: 4.644 seconds

$hadoop fs -ls /user/hive/warehouse/partition_test/
Found 3 items

drwxr-xr-x - admin supergroup 0 2015-01-29 10:06 
/user/hive/warehouse/partition_test/stat_date=2015/01/28

drwxr-xr-x - admin supergroup 0 2015-01-26 19:46
/user/hive/warehouse/partition_test/stat_date=20150129

drwxr-xr-x - admin supergroup 0 2016-01-29 09:53
/user/hive/warehouse/partition_test/stat_date=20150128

 

 

2、 插入数据;

使用一个辅助的非分区表 partition_test_input 准备向 partition_test 中插入数据,实现步骤如下。 
1) 查看 partition_test_input 表的结构和数据,命令如下:

hive> desc partition_test_input;  -- 表结构
hive> select * from partition_test_input;  -- 表数据

2)向 partition_test 的分区中插入数据,命令如下:

insert overwrite table partition_test 
partition(stat_date='2015-01-18',province='jiangsu')
select member_id,name from partition_test_input 
where stat_date='2016-04-28' 
and province='jiangsu';

向多个分区插入数据,命令如下。

hive> from partition_test_input
insert overwrite table partition_test partition(stat_date='2016-04-28',province='jiangsu') 
select member_id,name from partition_test_input where stat_date='2016-04-28' and province='jiangsu'

insert overwrite table partition_test partition(stat_date='2016-04-28',province='sichuan') 
select member_id,name from partition_test_input where stat_date='2016-04-28' and province='sichuan'

insert overwrite table partition_test partition(stat_date='2016-04-28',province='beijing') 
select member_id,name from partition_test_input where stat_date='2016-04-28' and province='beijing';

特别要注意,在其他数据库中,一般向分区表中插入数据时系统会校验数据是否符合该分区,如果不符合会报错。而在hive中,向某个分区中插入什么样的数据完全是由人来控制的,因为分区键是伪列,不实际存储在文件中,如:

hive> desc partition_test_input;
OK
stat_date string
member_id string
name string
province string

hive> select * from partition_test_input;
OK
20110526 1 liujiannan liaoning
20110526 2 wangchaoqun hubei
20110728 3 xuhongxing sichuan
20110728 4 zhudaoyong henan
20110728 5 zhouchengyu heilongjiang

然后我向partition_test的分区中插入数据:

hive> insert overwrite table partition_test partition(stat_date='20110728',province='henan') 
select member_id,name from partition_test_input 
where stat_date='20110728' and province='henan';

Total MapReduce jobs = 2
...
1 Rows loaded to partition_test
OK
hive> insert overwrite table partition_test partition(stat_date='20110527',province='liaoning') select member_id,name from partition_test_input;
Total MapReduce jobs = 2
...
5 Rows loaded to partition_test
OK

hive> select * from partition_test where stat_date='20110527' and province='liaoning';
OK
1 liujiannan 20110527 liaoning
2 wangchaoqun 20110527 liaoning
3 xuhongxing 20110527 liaoning
4 zhudaoyong 20110527 liaoning
5 zhouchengyu 20110527 liaoning

可以看到在partition_test_input中的5条数据有着不同的stat_date和province,但是在插入到partition(stat_date='20110527',province='liaoning')这个分区后,5条数据的stat_date和province都变成相同的了,因为这两列的数据是根据文件夹的名字读取来的,而不是实际从数据文件中读取来的

 

3、 动态分区

按照上面的方法向分区表中插入数据,如果数据源很大,针对一个分区就要写一个 insert ,非常麻烦。使用动态分区可以很好地解决上述问题。动态分区可以根据查询得到的数据自动匹配到相应的分区中去

动态分区可以通过下面的设置来打开:

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

动态分区的使用方法很简单,假设向 stat_date=’2016-04-28’ 这个分区下插入数据,至于 province 插到哪个子分区下让数据库自己来判断stat_date 叫做静态分区列,province 叫做动态分区列

hive> insert overwrite table partition_test partition(stat_date='2016-04-28',province)
select member_id,name province from partition_test_input where stat_date='2016-04-28';

注意,动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区。

hive.exec.max.dynamic.partitions.pernode:
每一个 MapReduce Job 允许创建的分区的最大数量,如果超过这个数量就会报错(默认值100)。

hive.exec.max.dynamic.partitions:一个 dml 语句允许创建的所有分区的最大数量(默认值100)。 
hive.exec.max.created.files:所有 MapReduce Job 允许创建的文件的最大数量(默认值10000)。

尽量让分区列的值相同的数据在同一个 MapReduce 中,这样每一个 MapReduce 可以尽量少地产生新的文件夹,可以通过 DISTRIBUTE BY 将分区列值相同的数据放到一起,命令如下。

insert overwrite table partition_test 
partition(stat_date,province)
select memeber_id,name,stat_date,province 
from partition_test_input 
distribute by stat_date,province;

 

 

 

© 著作权归作者所有

共有 人打赏支持
Avner
粉丝 8
博文 42
码字总数 45068
作品 0
杭州
程序员
hive 优化总结

1.当hive执行join内存溢出时,可以修改hive的配置文件hive-site.xml,增大内存,如下: mapred.child.java.opts -Xmx 1024m 2.hive默认建表时的路径也可以在hive-site.xml里配置,如下: hiv...

xrzs ⋅ 2012/10/11 ⋅ 0

hive 分区(partition)简介

网上有篇关于hive的partition的使用讲解的比较好,转载了: 一、背景 1、在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,...

xrzs ⋅ 2012/10/08 ⋅ 0

大数据平台搭建(四 ):hive中的表及UDF

前言      本章介绍hive内部表、外部表、分区表和UDF等。 1.hive表介绍     1.Hive虽说是数据仓库,其实可以认为就是一个mysql数据库,hive中的表名对应的是hdfs上的文件目录名,表内...

u012415035 ⋅ 04/13 ⋅ 0

hive数据仓库摘录和总结

Hive技术文档 ——Author HuangFx 2013/01/29 Hive是什么? Hive是蜂房的意思,为什么hadoop上的这层数据仓库叫Hive? 因为生物学上蜂房是一个结构相当精良的建筑,取名Hive足见则个数据仓库...

Zero零_度 ⋅ 2016/07/07 ⋅ 0

hive从查询中获取数据插入到表或动态分区

Hive的insert语句能够从查询语句中获取数据,并同时将数据Load到目标表中。现在假定有一个已有数据的表staged_employees(雇员信息全量表),所属国家cnty和所属州st是该表的两个属性,我们做...

码农啊就是弄嘛 ⋅ 2014/04/16 ⋅ 0

Hive 动态partition插入数据

Hive的insert语句能够从查询语句中获取数据,并同时将数据Load到目标表中。现在假定有一个已有数据的表staged_employees(雇员信息全量表),所属国家cnty和所属州st是该表的两个属性,我们做...

zyqJustin ⋅ 2016/10/19 ⋅ 0

Hive几种数据导入方式和动态分区,多表插入等调优小技巧

Hive几种数据导入方式和动态分区,多表插入等调优小技巧 Hive几种数据导入方式 今天的话题是总结Hive的几种常见的数据导入方式,我总结为四种: (1)、从本地文件系统中导入数据到Hive表; ...

helloxiaozhe ⋅ 03/26 ⋅ 0

Hive - truncate partition、drop partition 区别

Hive 有两种方法删除指定parition的数据:truncate partition, drop parition 功能: 两者都用于删除数据,即将对应的partition的数据文件删除。 不同点: truncate 只删除数据文件,保存在m...

ericquan8 ⋅ 2015/12/19 ⋅ 0

Hive内部表、外部表、分区表以及外部分区表创建以及导入数据实例讲解

源数据格式: 1. 内部表的创建以及数据的导入(重点:无论是内部表还是外部表,数据最终都会被移动到所使用的location下面,如果没有指定,就默认移动到hive-site.xml中配置的location) 创建...

a2011480169 ⋅ 01/08 ⋅ 0

Hadoop 2.6 + Hive 1.2.1 + spark-1.4.1(3)

新建表 1) 新建表结构 create table usertable( id int, userid bigint, name string, describe string comment 'desc表示用户的描述' ) comment '这是用户信息表' partitioned by(country ......

片刻 ⋅ 2015/12/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周六乱弹 —— 假如你被熊困到树上

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》 《如果写不出好的和弦就该在洒满阳光的钢琴前一起吃布丁》- 谢...

小小编辑 ⋅ 20分钟前 ⋅ 2

vbs 取文件大小 字节

dim namedim fs, s'name = Inputbox("姓名")'msgbox(name)set fs = wscript.createobject("scripting.filesystemobject") 'fs为FSO实例if (fs.folderexists("c:\temp"))......

vga ⋅ 今天 ⋅ 1

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部