partition是hive提供的一种机制:用户通过指定一个或多个partition key,决定数据存放方式,进而优化数据的查询

一个表可以指定多个partition key,每个partition在hive中以文件夹的形式存在。



实例(static partition):

编辑文件:/home/work/data/test3.txt; /home/work/data/test4.txt;

$ cat /home/work/data/test3.txt

1,zxm

2,ljz

3,cds

4,mac

5,android

6,symbian

7,wp



$ cat /home/work/data/test4.txt

8,zxm

9,ljz

10,cds

11,mac

12,android

13,symbian

14,wp

建表:

hive> create table student_tmp(id INT, name STRING)

> partitioned by(academy STRING, class STRING)

> row format delimited fields terminated by ',';

OK

Time taken: 6.505 seconds

id,name是真实列,partition列academy和class是伪列



load数据:(此处直接load数据进partition,在hive 0.6之前的版本,必须先创建好partition,数据才能导入)

hive> load data local inpath '/home/work/data/test3.txt' into table student_tmp
partition(academy='computer', class='034');

Copying data from file:/home/work/data/test3.txt

Copying file: file:/home/work/data/test3.txt

Loading data to table default.student_tmp partition (academy=computer, class=034)

OK

Time taken: 0.898 seconds

hive> load data local inpath '/home/work/data/test3.txt' into table student_tmp
partition(academy='physics', class='034');

Copying data from file:/home/work/data/test3.txt

Copying file: file:/home/work/data/test3.txt

Loading data to table default.student_tmp partition (academy=physics, class=034)

OK

Time taken: 0.256 seconds



查看hive文件结构:

$ hadoop fs -ls /user/hive/warehouse/student_tmp/

Found 2 items

drwxr-xr-x - work supergroup 0 2012-07-30 18:47 /user/hive/warehouse/student_tmp/academy=computer

drwxr-xr-x - work supergroup 0 2012-07-30 19:00 /user/hive/warehouse/student_tmp/academy=physics

$ hadoop fs -ls /user/hive/warehouse/student_tmp/academy=computer

Found 1 items

drwxr-xr-x - work supergroup 0 2012-07-30 18:47 /user/hive/warehouse/student_tmp/academy=computer/class=034



查询数据:

hive> select * from student_tmp where academy='physics';

OK

1 zxm physics 034

2 ljz physics 034

3 cds physics 034

4 mac physics 034

5 android physics 034

6 symbian physics 034

7 wp physics 034

Time taken: 0.139 seconds



以上是static partition的示例,static partition即由用户指定数据所在的partition,在load数据时,指定partition(academy='computer', class='034');

static partition常适用于使用处理时间作为partition key的例子。

但是,我们也常常会遇到需要向分区表中插入大量数据,并且插入前不清楚数据归宿的partition,此时,我们需要dynamic partition。

使用动态分区需要设置hive.exec.dynamic.partition参数值为true。

可以设置部分列为dynamic partition列,例如:partition(academy='computer', class);

也可以设置所有列为dynamic partition列,例如partition(academy, class);

设置所有列为dynamic partition列时,需要设置hive.exec.dynamic.partition.mode=nonstrict

需要注意的是,主分区为dynamic partition列,而副分区为static partition列是不允许的,例如partition(academy, class=‘034’);是不允许的

示例(dynamic partition):

建表

hive> create table student(id INT, name STRING)

> partitioned by(academy STRING, class STRING)

> row format delimited fields terminated by ',';

OK

Time taken: 0.393 seconds



设置参数

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

hive> set hive.exec.dynamic.partition=true;



导入数据:

hive> insert overwrite table student partition(academy, class)

> select id,name,academy,class from student_tmp

> where class='034';

Total MapReduce jobs = 2

.........

OK

Time taken: 29.616 seconds



查询数据:

hive> select * from student where academy='physics';

OK

1 zxm physics 034

2 ljz physics 034

3 cds physics 034

4 mac physics 034

5 android physics 034

6 symbian physics 034

7 wp physics 034

Time taken: 0.165 seconds



查看文件:

$ hadoop fs -ls /user/hive/warehouse/student/

Found 2 items

drwxr-xr-x - work supergroup 0 2012-07-30 19:22 /user/hive/warehouse/student/academy=computer

drwxr-xr-x - work supergroup 0 2012-07-30 19:22 /user/hive/warehouse/student/academy=physics

总结:

hive partition是通过将数据拆分成不同的partition放入不同的文件,从而减少查询操作时数据处理规模的手段。

例如,Hive Select查询中,如果没有建partition,则会扫描整个表内容,这样计算量巨大。如果我们在相应维度做了partition,则处理数据规模可能会大大减少。

|

附partition相关参数:

hive.exec.dynamic.partition(缺省false): 设置为true允许使用dynamic partition

hive.exec.dynamic.partition.mode(缺省strick):设置dynamic partition模式(nostrict允许所有partition列都为dynamic partition,strict不允许)

hive.exec.max.dynamic.partitions.pernode (缺省100):每一个mapreduce job允许创建的分区的最大数量,如果超过了这个数量就会报错

hive.exec.max.dynamic.partitions (缺省1000):一个dml语句允许创建的所有分区的最大数量

hive.exec.max.created.files (缺省100000):所有的mapreduce job允许创建的文件的最大数量



reference:

Dynamic Partitions

hive中简单介绍分区表(partition table),含动态分区(dynamic partition)与静态分区(static partition)

hive parition的使用,分dynamic和static两种的更多相关文章

  1. POJ 1182食物链(分集合以及加权两种解法) 种类并查集的经典

    题目链接:http://icpc.njust.edu.cn/Problem/Pku/1182/ 题意:给出动物之间的关系,有几种询问方式,问是真话还是假话. 定义三种偏移关系: x->y 偏移量 ...

  2. Java调用外部类定义的方法(Static与无Static两种)

    首先定义方法 public class Dy { public int Add(int x,int y){ //定义Add(),该方法没有被static修饰 return x+y; } public ...

  3. Hive动态分区和分桶(八)

    Hive动态分区和分桶 1.Hive动态分区 1.hive的动态分区介绍 ​ hive的静态分区需要用户在插入数据的时候必须手动指定hive的分区字段值,但是这样的话会导致用户的操作复杂度提高,而且在 ...

  4. hive的排序,分組练习

    hive的排序,分組练习 数据: 添加表和插入数据(数据在Linux本地中) create table if not exists tab1( IP string, SOURCE string, TY ...

  5. Hive基础语法5分钟速览

    Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 其优点是学习成本低,可以通过 ...

  6. hive:(group by, having;order by)的使用;group by+多个字段,以及wiki说的group by两种使用限制验证

    hive> select * from app_data_stats_historical where os='1' group by dt limit 100; 出现结果如下: 2014-01 ...

  7. Spark:DataFrame批量导入Hbase的两种方式(HFile、Hive)

    Spark处理后的结果数据resultDataFrame可以有多种存储介质,比较常见是存储为文件.关系型数据库,非关系行数据库. 各种方式有各自的特点,对于海量数据而言,如果想要达到实时查询的目的,使 ...

  8. java中线程分两种,守护线程和用户线程。

    java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...

  9. 华为 1.static有什么用途?(请至少说明两种)

    1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问 ...

随机推荐

  1. 让你的代码量减少3倍!使用kotlin开发Android(二) --秘笈!扩展函数

    本文承接上一篇文章:让你的代码量减少3倍!使用kotlin开发Android(一) 创建Kotlin工程 本文同步自博主的私人博客wing的地方酒馆 上一节说到,kotlin可以省去getter,se ...

  2. [shiro学习笔记]第四节 使用源代码生成Shiro的CHM格式的API文档

    版本为1.2.3的shiro API chm个事故文档生成. 获取shiro源代码 编译生成API文档 转换成chm格式 API 获取shiro源代码 shiro官网: http://shiro.ap ...

  3. React native和原生之间的通信

    RN中文网关于原生模块(Android)的介绍可以看到,RN前端与原生模块之 间通信,主要有三种方法: 1)使用回调函数Callback,它提供了一个函数来把返回值传回给JavaScript. 2)使 ...

  4. java之IO流详解(一)

    IO流的分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流  InputStream 字节输出流  OutputStream 字符流 字符输入流  Reader 字 ...

  5. 与markdown的第一次接触

    什么是markdown markdown是一种比html轻量级的标记语言. markdown的介绍与学习请参考:markdown认识与入门 CSDN Markdown博客视频教程 知乎: 怎样引导新手 ...

  6. PullToRefreshScrollView 嵌套RecyclerView实现特卖列表倒计时抢购

    不久之前,我们谈到了通过Handler与timer及TimerTask结合实现倒计时抢购列表,那个是PullToRefreshListView实现的,今天要讲的是PullToRefreshScroll ...

  7. Android中PropertyAnimation属性动画详解(一)

    在之前的文章中已经讲了帧动画frame-by-frame animation和补间动画tweened animation,其实这两种动画原理好简单,都是按照预先固定的动画模式来播放的,帧动画将一张张单 ...

  8. Android事件总线EventBus详解

    顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity.Fragment.Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码 ...

  9. Servlet编程实例-servlet学习之旅(三)

    LoginServlet代码: public class LoginServlet extends HttpServlet{ @Override protected void service(Http ...

  10. Java基础--Java---IO流------GUI(布局)、Frame、事件监听机制、窗体事件、Action事件、鼠标事件、对话框Dialog、键盘事件、菜单

     * 创建图形化界面  * 1.创建frame窗体  * 2.对窗体进行基本设置  *   比如大小.位置.布局  * 3.定义组件  * 4.将组件通过窗体的add方法添加到窗体  * 5.让窗体显 ...