数据仓库-hive分区表
什么是分区
在逻辑上分区表与未分区表没有区别,在物理上分区表会将数据按照分区键的列值存储在表目录的子目录中,目录名=“分区键=键值”。其中需要注意的是分区键的值不一定要基于表的某一列(字段),它可以指定任意值,只要查询的时候指定相应的分区键来查询即可。我们可以对分区进行添加、删除、重命名、清空等操作。因为分区在特定的区域(子目录)下检索数据,它作用同DNMS分区一样,都是为了减少扫描成本。
Hive(Inceptor)分区又分为单值分区、范围分区。单值分区又分为静态分区和动态分区。我们先看下分区长啥样。如下,假如有一张表名为persionrank表,记录每个人的评级,有id、name、score字段。我们便可以创建分区rank(注意rank不是表中的列,我们可以把它当做虚拟列),并将相应数据导入指定分区(将数据插入指定目录)。
分区的好处
分区的种类
1、静态分区
单分区
create table t1(id int,name string,hobby array<string>,add map<String,string>
)
partitioned by (pt_d string)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
;
注:这里分区字段不能和表中的字段重复。
如果分区字段和表中字段相同的话,会报错,如下:
create table t1(id int,name string,hobby array<string>,add map<String,string>
)
partitioned by (id int)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
;
报错信息:FAILED: SemanticException [Error 10035]: Column repeated in partitioning columns
装载数据
1,xiaoming,book-TV-code,beijing:chaoyang-shagnhai:pudong
2,lilei,book-code,nanjing:jiangning-taiwan:taibei
3,lihua,music-book,heilongjiang:haerbin
执行load data
load data local inpath '/home/hadoop/Desktop/data' overwrite into table t1 partition ( pt_d = '201701');
查看数据 select * from t1;
1 xiaoming ["book","TV","code"] {"beijing":"chaoyang","shagnhai":"pudong"} 201701
2 lilei ["book","code"] {"nanjing":"jiangning","taiwan":"taibei"} 201701
3 lihua ["music","book"] {"heilongjiang":"haerbin"} 201701
给t1添加分区
alter table t1 add partition (pt_d ='00000');
重新加载一份新的数据
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"} 000000
2 lilei ["book","code"] {"nanjing":"jiangning","taiwan":"taibei"} 000000
3 lihua ["music","book"] {"heilongjiang":"haerbin"} 000000
1 xiaoming ["book","TV","code"] {"beijing":"chaoyang","shagnhai":"pudong"} 201701
2 lilei ["book","code"] {"nanjing":"jiangning","taiwan":"taibei"} 201701
3 lihua ["music","book"] {"heilongjiang":"haerbin"} 201701
可以查询单个分区
select * from t1 where pt_d = ‘000000’
多个分区
create table t10(id int,name string,hobby array<string>,add map<String,string>
)
partitioned by (pt_d string,sex string)
row format delimited
fields 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的树状文件夹结构。
2、动态分区
如果用上述的静态分区,插入的时候必须首先要知道有什么分区类型,而且每个分区写一个load data,太烦人。使用动态分区可解决以上问题,其可以根据查询得到的数据动态分配到分区里。其实动态分区与静态分区区别就是不指定分区目录,由系统自己选择。
首先启动分区功能
hive> set hive.exec.dynamic.partition=true;
假设已有一张表par_tab,前两列是名称name和国籍nation,后两列是分区列,性别sex和日期dt,数据如下:
create table par_dam(
name string,
nation string,
)partitioned by (sex string,date string)
并加载数据
select * from par_tab;OK
lily china man 2013-03-28
nancy china man 2013-03-28
hanmeimei america man 2013-03-28
jan china man 2013-03-29
mary america man 2013-03-29
lilei china man 2013-03-29
heyong china man 2013-03-29
yiku japan man 2013-03-29
emoji japan man 2013-03-29
Time taken: 1.141 seconds, Fetched: 9 row(s)
现在我把这张表的内容直接插入到另一张表par_dnm中,并实现sex为静态分区,dt动态分区(不指定到底是哪日,让系统自己分配决定)
create table par_dam(
name string,
nation string,
)partitioned by (sex string,date string)
insert overwrite table par_dnm partition(sex='man',dt)
select name, nation, dt from par_tab;
插入后看下目录结构
drwxr-xr-x - hadoop supergroup 0 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man
drwxr-xr-x - hadoop supergroup 0 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man/dt=2013-03-28
-rwxr-xr-x 1 hadoop supergroup 41 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man/dt=2013-03-28/000000_0
drwxr-xr-x - hadoop supergroup 0 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man/dt=2013-03-29
-rwxr-xr-x 1 hadoop supergroup 71 2017-03-29 10:32 /user/hive/warehouse/par_dnm/sex=man/dt=2013-03-29/000000_0
再查看分区数
show partitions par_dnm;OK
sex=man/dt=2013-03-28
sex=man/dt=2013-03-29
Time taken: 0.065 seconds, Fetched: 2 row(s)
证明动态分区成功。
动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区。
动态分区可以允许所有的分区列都是动态分区列,但是要首先设置一个参数hive.exec.dynamic.partition.mode :
set hive.exec.dynamic.partition.mode;
它的默认值是strick,即不允许分区列全部是动态的,这是为了防止用户有可能原意是只在子分区内进行动态建分区,但是由于疏忽忘记为主分区列指定值了,这将导致一个dml语句在短时间内创建大量的新的分区(对应大量新的文件夹),对系统性能带来影响。所以我们要设置:
set hive.exec.dynamic.partition.mode=nostrick;
现在我把这张表的内容直接插入到另一张表par_dnm中,并实现sex为静态分区,dt动态分区(不指定到底是哪日,让系统自己分配决定)
insert overwrite table par_dnm partition(sex,dt)
select name,nation,sex,dt from par_tab;
表分区的增删修查
1、增加分区
一次增加一个分区
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分区和sex分区。那么我们添加一个age分区为1,sex分区为male的数据,可以这样添加:
alter table testljb add partition(age=1,sex='male');
2、删除分区
删除分区age=1
alter table testljb drop partition(age=1);
3、修复分区
修复分区就是重新同步hdfs上的分区信息。
msck repair table table_name;
4、查询分区
show partitions table_name;
数据仓库-hive分区表相关推荐
- 数据仓库Hive编程——HiveQL的数据定义(一):Hive中的数据库
分类目录:商业智能<数据仓库Hive编程>总目录 相关文章: HiveQL的数据定义(一):Hive中的数据库 HiveQL的数据定义(二):修改数据库 HiveQL的数据定义(三):创建 ...
- spark写表指定外部表_spark 将dataframe数据写入Hive分区表
从spark1.2 到spark1.3,spark SQL中的SchemaRDD变为了DataFrame,DataFrame相对于SchemaRDD有了较大改变,同时提供了更多好用且方便的API. D ...
- 大数据数据仓库——hive学习权威指南
友情提示:更多有关大数据.人工智能方面技术文章请关注博主个人微信公众号:大数据分析爱好者社区! 学习hive权威指南 目录: ETL介绍 大数据平台架构概述 系统数据流动 hive概述 hive在ha ...
- 14.基于Hadoop的数据仓库Hive第1部分
数据仓库.数据库的区别:数据仓库相对稳定,数据基本不变化数据仓库保留历史状态和历史信息,数据库不保留历史数据(以便于分析以往的数据,便于决策) [说明]传统的数据仓库进行存储数据还是借助底层的传统的关 ...
- sqoop动态分区导入mysql,sqoop 导入数据到hive分区表(外表,内表) 指定分区 指定数据库 指定表...
sqoop 导入数据到hive 1.1.导入数据到hive分区表(内表),指定分区 创建hive分区表 –hive-database 指定数据库 –table 指定表 –hive-overwrite ...
- hive sqoop 分区导入_利用oozie,执行sqoop action将DB2中的数据导入到hive分区表中
测试:利用oozie,执行sqoop action将DB2中的数据导入到hive分区表中. 需要注意的地方: 1,要添加hive.metastore.uris这个参数.否则无法将数据加载到hive表中 ...
- Spark操作Hive分区表
前言 Spark操作Hive表可谓是异常的方便和简单,这里根据官网简单的总结一下Spark操作Hive分区表 完美的处理处理方式 // 开启Hive动态分区 spark.sqlContext.setC ...
- 【大数据入门】Hadoop技术原理与应用之基于Hadoop的数据仓库Hive
基于Hadoop的数据仓库Hive 文章目录 基于Hadoop的数据仓库Hive @[toc] 6.1 概述 6.1.1 数据仓库概念 6.1.2 传统数据仓库面临的挑战 6.1.3 Hive简介 6 ...
- 数据仓库-Hive(一)
文章目录 数据仓库-Hive 1. 数据仓库 1.1. 基本概念 1.2. 主要特征 1.2.1. 面向主题 1.2.2. 集成性 1.2.3. 非易失性 1.2.4. 时变性 1.3. 数据库与数据 ...
最新文章
- Java 之String、StringBuffer 和 StringBuilder 三者区别介绍
- 工作中不要为了用系统而用系统
- 关于 STM32G0/G4/L4 HAL_IIC HAL_I2C_Mem_Read 函数读取M24C64存储芯片遇到的问题
- Python入门学习笔记11(静态方法、类方法与属性方法)
- 事务连接中断_一文搞懂分布式事务-CAP理论
- mikechen谈技术人成长的三大原则
- tensorrt轻松部署高性能dnn推理_NVIDIA TensorRT高性能深度学习推理
- typedef 浅析
- 用 CSS实现Bubble提示框的两种方法
- CSC 121, 122.. MAT 181, 182, 252, 271, 281, 474.. ECN 272, 273, 372, 472
- (85)Verilog HDL:板间信号同步
- Struts2学习笔记(四) Action(中)
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux内核抢占实现机制分析...
- 设计一个具有大纯时延时间的一阶惯性环节的计算机控制系统,一阶惯性环节的计算机控制课程设计【参考】.doc...
- 外卖客户端容器化架构的演进
- upc 卡德加的兔子 线段树 + 矩阵快速幂
- 分布式 Git - 为项目做贡献
- 二元logistic回归、ROC曲线及cutoff值
- 【今日学长】来自柚子帮学长--英国留学租房攻略!
- 在Ubuntu上部署ROS以及如何搭建工作空间和功能包的创建与编译