分区是hive存放数据的一种方式。将列值作为目录来存放数据,就是一个分区。这样where中给出列值时,只需根据列值直接扫描对应目录下的数据,不扫面其他不关心的分区,快速定位,查询节省大量时间。分动态和静态分区两种

动态分区

1)不显示的给出分区名,根据列的取值自动建立对应分区(多少种取值,多少种分区),所以需要限制最大分区数:
SET hive.exec.dynamic.partition=true;
SET hive.exec.max.dynamic.partitions.pernode=1000;
SET hive.exec.max.dynamic.partitions=3000;
2)分区全部使用动态分区,还要设置为nonstrict模式,否则无法执行
set hive.exec.dynamic.partition.mode=nonstrict; 3)动态分区按位置来对应,跟名称无关。所以查询select中必须在最后字段按动态分区顺序给出对应字段
    insert overwrite table tb_pmp_raw_log_analysis_count partition (day='2016-05-17', media,type)
select advertiser_id,ad_plan_id,crt_id,hour,ad_place_id,city_bidrequest,device,network,os,category,channel,ad_type,rtb_type,price,count(1) as cnt,media, 1 as type
from (
select
split(all,'\\\\|~\\\\|')[41] as advertiser_id,
split(all,'\\\\|~\\\\|')[10] as ad_plan_id,
split(all,'\\\\|~\\\\|')[11] as crt_id,
substr(split(all,'\\\\|~\\\\|')[0],12,2) as hour,
case
when split(split(all,'\\\\|~\\\\|')[5],'/')[1] = 'wax' then split(all,'\\\\|~\\\\|')[17]
else split(all,'\\\\|~\\\\|')[7]
end as city_bidrequest,
NULL as device,
NULL as network,
NULL as os,
NULL as category,
NULL as channel,
NULL as ad_type,
NULL as rtb_type,
split(all,'\\|~\\|')[13] as price,
split(split(all,'\\\\|~\\\\|')[5],'/')[1] as media
from tb_pmp_raw_log_bid_tmp tb
) a
group by advertiser_id,ad_plan_id,crt_id,hour,ad_place_id,city_bidrequest,device,network,os,category,channel,ad_type,rtb_type,price,media
distribute by media;
注意:动态分区名称无关,顺序必须一致

4)distribute by 和动态分区原理一样,一般不一起用,如代码

5)动态分区与静态分区混用:
a) 只要有一个静态分区,就可以在默认的strict状态执行。如上代码,动静分区混用时,不用设置nonstrict状态。
b) 动态分区不能在静态分区前面,在select中按位置顺序出现在最后(因为静态分区提前产生,动态分区运行时产生,如果动态分区作为父路径,则子静态分区无法提前生成。会报错为动态分区不能为静态的父路径)。代码中,type设为静态,但media是动态,会报错,所以才在内部给定type的值。如果分区顺序改为day、type、media,则可以将day和type作为静态,media做动态。

Hive partition 导出时无名称:

存在分区partition的hive表,用select *返回包括分区字段值。
但select * >localdata.txt导入本地文件,无分区字段名称,但值记录存在。也就是说,文件中第一行的属性字段中无分区字段属性,而分区属性的取值在记录中存在。
如果要导入数据到mysql里,或用kettle读入时,记得要手动加上分区列对应的属性列名称

Hive partition 简介

在HiveSelect查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作。有时候只需要扫描表中关心的一部分数据,因此引入了partition概念。建表时指定partition空间。一个Partition对应于表下的一个目录,所有的Partition的数据都存储在自己的目录。
总的说来partition就是辅助查询,缩小查询范围,加快数据的检索速度和对数据按照一定的规格和条件进行管理。

Partition的使用:

查看分区:show partitions hive_tb;
1、分区以字段形式在表结构中存在,通过describetable命令可以查看分区字段,但该字段不存放实际的数据内容,仅仅是分区的表示。
2、可有多个分区,每个分区以文件夹的形式单独存在表文件夹的目录下。
3、分区建表分为2种,一种是单分区,在表文件夹目录下只有一级文件夹目录。另外一种是多分区,表文件夹下多文件夹嵌套模
a、单分区建表语句:createtable day_table (id int, content string) partitioned by (dt string);单分区表,按天分区,在表结构中存在id,content,dt三列。
b、双分区建表语句:createtable day_hour_table (id int, content string) partitioned by (dt string, hourstring);双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。

Hive partition基本语法:

1.创建分区表语法:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_namedata_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY(col_name data_type [COMMENT col_comment], ...)] [CLUSTERED BY (col_name,col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS][ROW FORMAT row_format] [STORED AS file_format] [LOCATION hdfs_path]
双分区表,按天和小时分区,在表结构中新增加了dt和hour两列。
create table day_hour_table (id int, content string)partitioned by (dt string, hour string);
2.添加分区表语法(表已创建,在此基础上添加分区):
ALTERTABLE table_name ADD partition_spec [ LOCATION 'location1' ] partition_spec [LOCATION 'location2' ] ... partition_spec: : PARTITION (partition_col =partition_col_value, partition_col = partiton_col_value, ...)
向一个表中增加分区(ALTER TABLE ADDPARTITION)。当分区名是字符串时加引号。例:
ALTERTABLE day_table ADD PARTITION (dt='2008-08-08', hour='08') location'/path/pv1.txt' PARTITION (dt='2008-08-08', hour='09') location'/path/pv2.txt';
3.删除分区(ALTER TABLE table_name DROP partition_spec,partition_spec,…)分区的元数据和数据将被一并删除,例:
ALTERTABLE day_hour_table DROP PARTITION (dt='2008-08-08', hour='09');
4.分区表加载数据语法:
LOADDATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION(partcol1=val1, partcol2=val2 ...)]

例:

LOADDATA INPATH '/user/pv.txt' INTO TABLE day_hour_table PARTITION(dt='2008-08-08', hour='08'); LOAD DATA local INPATH '/user/hua/*' INTO TABLE day_hourpartition(dt='2010-07- 07');
数据加载至表中,不会对数据进行任何转换。Load操作只是将数据复制至Hive表对应的位置。数据加载时自动在表下创建一个目录,文件存放在该分区下。
5.基于分区的查询的语句:
SELECTday_table.* FROM day_table WHERE day_table.dt>= '2008-08-08';
6. 查看分区:
show partitions 表名;
show partitions hive_tb; hive中partition的实际操作: hive>create table mp (a string) partitioned by (b string, c string);
hive> alter table mp add partition (b='1', c='1');
hive> alter table mp add partition (b='1', c='2');
hive> alter table mp add partition (b='2', c='2');
hive> show partitions mp ; b=1/c=1
b=1/c=2
b=2/c=2 hive>explain extended alter table mp drop partition (b='1'); ABSTRACTSYNTAX TREE:
(TOK_ALTERTABLE_DROPPARTS mp (TOK_PARTSPEC (TOK_PARTVAL b '1')))
STAGEDEPENDENCIES:
Stage-0 is a root stage
STAGEPLANS:
Stage: Stage-0
Drop Table Operator:
Drop Table
table: mp hive> alter table mp drop partition (b='1');
FAILED: Error in metadata: table is partitioned but partition spec is notspecified or tab: {b=1}
FAILED: Execution Error, return code 1 fromorg.apache.hadoop.hive.ql.exec.DDLTask
hive> show partitions mp ; b=1/c=1
b=1/c=2
b=2/c=2 hive>alter table mp add partition ( b='1', c = '3') partition ( b='1' , c='4');
hive> show partitions mp ;
b=1/c=1
b=1/c=2
b=1/c=3
b=1/c=4
b=2/c=2
b=2/c=3 hive>insertoverwrite table mp partition (b='1', c='1') select cnt from tmp_et3 ;
hive>altertable mp add columns (newcol string);
location指定目录结构:
alter table wizad_mdm_raw_hdfs add partition (day='2014-11-07',adn='3') location '/user/wizad/data/wizad/raw/2014-11-07/3_1/';
hive>alter table alter2 add partition (insertdate='2008-01-01') location'2008/01/01';
hive>alter table alter2 add partition (insertdate='2008-01-02') location'2008/01/02';

hive分区partition(动态和静态分区混合使用; partition的简介)的更多相关文章

  1. Partition:分区切换(Switch)

    在SQL Server中,对超级大表做数据归档,使用select和delete命令是十分耗费CPU时间和Disk空间的,SQL Server必须记录相应数量的事务日志,而使用switch操作归档分区表 ...

  2. 磁盘、分区及Linux文件系统 [Disk, Partition, Linux File System]

    1.磁盘基础知识 1.1 物理结构 硬盘的物理结构一般由磁头与碟片.电动机.主控芯片与排线等部件组成:当主电动机带动碟片旋转时,副电动机带动一组(磁头)到相对应的碟片上并确定读取正面还是反面的碟面,磁 ...

  3. DBA_Oracle Table Partition表分区概念汇总(概念)

    2014-06-20 Created By BaoXinjian

  4. kafka partition(分区)与 group

    kafka partition(分区)与 group   一. 1.原理图 2.原理描述 一个topic 可以配置几个partition,produce发送的消息分发到不同的partition中,co ...

  5. CAP理论中, P(partition tolerance, 分区容错性)的合理解释

    在CAP理论中, 对partition tolerance分区容错性的解释一般指的是分布式网络中部分网络不可用时, 系统依然正常对外提供服务, 而传统的系统设计中往往将这个放在最后一位. 这篇文章对这 ...

  6. SQL Server PARTITION FUNCTION(分区)

    分区并不影响Linq,sql查询 在MSSQL中,选中目标表,右键-存储-创建分区 根据提示完成分区,存储成sql 这里展示如何根据Id的数据范围分区 在执行前,可能需要设置日志文件大小为" ...

  7. hive动态分区和混合分区

    各位看官,今天我们来讨论下再Hive中的动态分区和混合分区方面的一些知识点以及相关的一些问题. 前面我们已经讲过管理表和外部表的一般分区的一些知识点,对于需要对表创建很多的分区,那么用户就需要些很多的 ...

  8. hive SQL 静态分区和 动态分区

    Hive 分区介绍: hive中简单介绍分区表(partition table),含动态分区(dynamic partition)与静态分区(static partition) hive中创建分区表没 ...

  9. 【转】Hive 基础之:分区、桶、Sort Merge Bucket Join

    Hive 已是目前业界最为通用.廉价的构建大数据时代数据仓库的解决方案了,虽然也有 Impala 等后起之秀,但目前从功能.稳定性等方面来说,Hive 的地位尚不可撼动. 其实这篇博文主要是想聊聊 S ...

随机推荐

  1. sublime高亮代码导出

    何在word/博客中使用SublimeText风格的代码高亮样式 原文链接:http://www.cnblogs.com/Wayou/p/highlight_code_with_sublimetext ...

  2. 如何设计一款APP,才能吸引用户眼球

    有APP分析机构研究表明,人们每天耗费在手机和平板上的平均时长为158分钟,其中127分钟是耗费在各类APP中,而仅有31分钟是花费在浏览网页上.随着人们对互联网的依赖性越来越强,移动APP发展迅速已 ...

  3. JavaScript数据结构与算法(一) 栈的实现

    TypeScript版本源码 class Stack { items = []; public push(element) { this.items.push(element); } public p ...

  4. Multipath在OpenStack中的faulty device的成因及解决(part 2)

    | 版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.如有问题,可以邮件:wangxu198709@gmail.com 简介 在上次的文章M ...

  5. 想进大厂,想收获高薪offer,资深猎头告诉你怎么做......

    其实吧,面试官面试的时候主要就看三个方面:现在能力如何,未来潜力如何,人品如何. 第一个因素是最重要的,因为后面两个因素有太多的人为判断因素,无法量化.所谓的面试准备,"现在能力如何&quo ...

  6. [Codeforces 933A]A Twisty Movement

    Description 题库链接 给你一个长度为 \(n\) 的只含有 \(1,2\) 的序列.你可以选择其中的一段 \([l,r]\) ,将区间翻转,翻转后使得单调不下降序列最长.求最长长度. \( ...

  7. [HNOI 2002]跳蚤

    Description Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个 ...

  8. [UOJ UR #4追击圣诞老人]

    来自FallDream的博客,未经允许,请勿转载, 谢谢. 传送门 考虑直接维护一个堆,然后往里面丢链,并且取出k个堆顶就行了. 然后就需要分类讨论啥的,给你的三个点变成两条链,每次取出一条链之后选择 ...

  9. VK-Cup2017 Wild Card Round 2

    来自FallDream的博客,未经允许,请勿转载,谢谢. Cf的Vkcup外卡赛2  上次round2和ditoly翻车了 所以只好来打打了  规则是给一道比较特殊的题目,你要找出较优的解 Unive ...

  10. 正则替换replace中$1的用法以及常用正则

    一.repalce定义 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. stringObject.replace(regexp/substr,replacement)参数一 ...