hive分区表

【hive】- 使用insert into/insert overwrite插入数据到静态分区、动态分区、动静态分区 使用insert into/insert overwrite插入数据到静态分区、动态分区、动静态分区 阅读详情

hive分区表

2017年07月17日 00:32:10 阅读数:994 标签: hive 数据 分区表  更多

个人分类: hive

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/u010521842/article/details/75213503

分区表

1 为什么出现分区表?

假设有海量的数据保存在hdfs的某一个hive表明对应的目录下,使用hive进行操作的时候,往往会搜索这个目录下的所有文件,这有时会非常的耗时,如果我们知道 这些数据的某些特征,可以事先对他们进行分裂,再把数据load到hdfs上的时候,他们就会被放到不同的目录下,然后使用hive进行操作的时候,就可以在where子句中对这些特征进行过滤,那么对数据的操作就只会在符合条件的子目录下进行,其他不符合条件的目录下的内容就不会被读取,在 数据量非常大的时候,这样节省大量的时间,这种把表中的数据分散到子目录下的方式就是分区表。

2 实际例子:

某个电商网站的订单信息,全部的信息量是非常多的,其中有月份的字段,如果想对月份进行汇总分析,找到哪个月的订单最多,hive语句中使用where条件进行过滤即可,但是这样就会扫描这个表中所有的文件,不是这个月的记录也会被扫描,极大的浪费了时间,如果能把数据按照月份分别存放,那么在查询的时候,就只查询这个月的数据了。

分区表是hive中一种常见的优化手段。

3 创建分区表语法

hive>create table emp(name string, age int) partitioned by (provice string,city string);
  • 1

用partitioned by指定创建的分区,多个分区意味着多级目录。 
创建之后hdfs上的目录结构并不会立即发生变化,因为此时表中还没有数据,往表中插入数据之后,会发现在表名对应的目录下,会多出两级目录。

hive>insert into emp partition(provice = "hebei", city = "baoding") values("tom",22);
hive>dfs -ls -R /user/warehouse/;
  • 1
  • 2

输入命令之后会大致显示如下信息:

/user/hive/warehouse/base1.db/emp/provice=hebei
/user/hive/warehouse/base1.db/emp/provice=hebei/city=baoding
/user/hive/warehouse/base1.db/emp/provice=hebei/city=baoding/000000_0
  • 1
  • 2
  • 3

插入的数据指定了不同的分区之后,会生成不同的文件夹。

3.1 批量load数据到不同的分区上

hive>load data local inpath '/home/user1/emp.txt' overwrite into table t1 partition(provice = "hebei",city = "baoding");
hive>load data local inpath '/home/user1/emp.txt' overwrite into table t1 partition(provice = "hebei",city = "handan");
  • 1
  • 2

由于指定了不同的分区,数据在上传时就会进入不同的目录下。

4 查看表的分区信息

在插入两个分区的数据之后,查看表的分区信息,就会将这个表的所有分区都显示出来。

hive>show partitions database1.table;
OK
provice=hebei/city=baoding
provice=hebei/city=handan
  • 1
  • 2
  • 3
  • 4

5 使用分区对数据进行过滤

分区表使用的分区字段不是在数据中存在的(比如创建了一个国家分区,但是数据中并没有这个字段),分区字段只是为了在HDFS上产生了对应的子目录。在使用hive查询的时候,完全可以使用where对分区进行过滤。

hive> select * from t3 where city='changchun';
OK
xiaobai 2       jilin   changchun
toms    34      jilin   changchun
haoling 27      jilin   changchun
Time taken: 0.786 seconds, Fetched: 3 row(s)
---------------------------------------------------
hive> select * from t3 where provice = 'jilin';
OK
xiaobai 2       jilin   changchun
toms    34      jilin   changchun
haoling 27      jilin   changchun
Time taken: 0.22 seconds, Fetched: 3 row(s)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

6 修改分区(重构分区)

修改分区意味着对原有的分区进行增减,即重构分区。

6.1 添加分区

不改变分区的级数,而是改变分区字段的值。 
两种方式:一种是先插入分区值,再往上放数据;二是插入分区和值同时进行。

方式一: 
先添加一个分区值city = ‘shijiazhuang’,再往这个分区下插入数据

hive>alter table emp add partition(provice = "hebei", city = "shijiazhuang");
hive>show partitions emp;
OK
provice=hebei/city=baoding
provice=hebei/city=handan
provice=hebei/city=shijiazhuang

hive>insert into partition(provice = 'hebei', city = 'shijiazhuang') values('tomslee',26);
hive>select * from emp where city = 'shijiazhuang';
tomslee 26  hebei   shijiazhuang
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

方式二: 
在插入数据的时候直接指定新的分区,即把创建分区和插入数据两个步骤在一次完成

hive>insert into emp partition(provice = 'hebei',city = 'aa') values ('hello',40);
hive> show partitions emp;
OK
provice=hebei/city=aa
provice=hebei/city=baoding
provice=hebei/city=handan
provice=hebei/city=shijiazhuang
Time taken: 0.162 seconds, Fetched: 4 row(s)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

7 删除分区

分区对应的是hdfs上的目录,分区的删除涉及到对应的数据是否会被删除的问题,如果此表是内部表的话,那么分区的删除意味着对应目录下的数据会被删除,如果是外部表的话,分区的删除就不会删除对应的数据文件。

分别创建两个分区表,一个是管理表,一个是外部表,并在其中放入一些数据,然后尝试删除分区,查看HDFS上的数据是否会被删除。

#创建两个表,一个管理表,一个外部表,都包含一个分区 
hive> create table managed_t(name string) partitioned by (add string);
hive> create external table ex_table(name string) partitioned by (add string);

#往两个表中上传数据
hive> load data local inpath '/home/user1/name.dat' into table managed_table partition(add = 'beijing');
hive> load data local inpath '/home/user1/name.dat' into table ex_table partition(add = 'beijing');

#两个表的目录结构如下:
/user/hive/warehouse/base1.db/ex_table
/user/hive/warehouse/base1.db/ex_table/add=beijing
/user/hive/warehouse/base1.db/ex_table/add=beijing/name.dat
/user/hive/warehouse/base1.db/managed_t
/user/hive/warehouse/base1.db/managed_t/add=beijing
/user/hive/warehouse/base1.db/managed_t/add=beijing/name.dat

#分别删除两个表的分区,再次查看HDFS上的数据是否还在

hive>alter table managed_t drop partition (add = 'beijing');
hive>alter table ex_table drop partition (add = 'beijing');

/user/hive/warehouse/base1.db/ex_table
/user/hive/warehouse/base1.db/ex_table/add=beijing
/user/hive/warehouse/base1.db/ex_table/add=beijing/name.dat
/user/hive/warehouse/base1.db/managed_t
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

从结果看出,管理表的数据已经被删除,只剩下表名(因为删除的是分区,并不是表),但是外部表的数据依然存在。

8 动态分区表

当一个分区表创建之后,其分区的值是可以动态修改的(先创建分区值,再插入数据;或者是在插入数据的时候指定一个新的分区值),这两种方式都是需要手动的去指定分区值。 
当分区变的非常多的时候(比如气象站的气温记录数据,根据年份分区之后,还有根据月份分区,下面可能还有根据日期分区),当要上传数据到这样的表中的时候,手动去指定分区显然是不现实的。 
这个时候,就需要使用到动态分区,动态分区可以在往表中插入数据的时候,动态的根据值来选择数据进入的分区。

8.1 动态分区使用场景

假设在HDFS上已经存在一个宽表(例如,职员表,这个表的字段非常多,并且数据量也很大),我们想要根据国家和省份把这些数据放到不同的分区中,使用动态分区是十分合适的。

8.2 创建动态分区表

1.首先创建一个分区表,指定两级分区,国家和省份

hive>create table emp(name string,age int) 
hive>partitioned by (country string,state string) 
hive>row format delimited 
hive>fields terminated by '\t' 
hive>lines terminated by '\n' 
hive>stored as textfile;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.从宽表中查询出所需要的字段加载到分区表中

hive>insert into table emp partition(country,state) select name,age,country,state from t1;
  • 1

注意:如果出现如下错误

FAILED: SemanticException [Error 10096]: 
Dynamic partition strict mode requires at least one static partition column. 
To turn this off set hive.exec.dynamic.partition.mode=nonstrict
-------------------------------------------------------
#严格模式下,不允许所有的分区都被动态指定,目的是为了防止生成太多的目录.通过下面语句可以解决问题:
hive>set hive.exec.dynamic.partition.mode=nonstrict;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这里就是动态分区的关键: 
在指定分区的时候,不指定其值,而只是指定分区的名称,在后面的查询语句中,所查询的最后两个字段就会被对应到这两个分区上,也就是说,前面分区不指定值的话,就会到后面的查询语句中去动态的寻找值,这时可以想象,后面的查询语句的字段必须是大于等于前面的分区数;

8.3 半动态分区表

所谓半动态分区就是并不是所有的分区值都是动态指定的,其中有一部分是固定值,另一部分需要在查询列中动态赋值,例如:

hive>insert into table emp partition(country = 'US',state) 
hive>select name,age,country,state from t1;
  • 1
  • 2

上述语句中,分区country就是一个固定的值US,state的值没有指定,而是动态赋值,半分区模式需要注意的是,动态分区必须放在最后。

在hive中创建分区表,再关联到hdfs有关位置,而不需导入数据到hive表 【需求】有时候我们不想导入数据到hive中,而是通过在hive中创建关联表的方式查询hdfs上的数据,之后就能通过hive客户端或者spark应用程序获取hive的数据了。【原理】由于在hdfs中已存入了我们提前整理好的结构化数据(例如每条记录都是以逗号分隔),那么在hive中建一个相同结构的表,再把此表关联到相应的hdfs目录就可以了。下面一个小案例讲一下我的经验。步骤——步骤一:在hive中创... 阅读详情

相关推荐

Hive 分区表和二级分区表的基本操作

Hive分区就是在HDFS上创建独立的文件夹,该文件夹下是该分区的所有的数据文件。Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过WHERE子句中的表达式选择来查询所需要的指定分区,这样的查询效率会提高很多。 1、引入分区表 最终呈现的效果就是在HDFS上按照分区的目录存储文件: /user/hive/warehose/log/201801/01/dep...

小马哥的博客 9483

hive之insert导入分区数据

数据库分区的主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间,主要包括两种分区形式:水平分区与垂直分区。水平分区是对表进行行分区。而垂直分区是对列进行分区,一般是通过对表的垂直划分来减少目标表的宽度,常用的是水平分区。 回到顶部 1、分区参数介绍 hive.exec.dynamic.partition:是否启动动态分区。默认false。 hive.exec.d...

kwame211的博客 1万+

Hive分区表的使用

一、静态分区 1、创建一张分区表 create table test_part_table(word string,num bigint )partitioned by(dt string)row format delimited fields terminated by ‘\t’; 可以看出,表中除了word string,num bigint两个字段外,还多了个dt字段。 2、插入数据 依次执行以下两条语句 insert overwrite table test_part_table part

wysghmbb的博客 1334

hive —— 分区表

hive —— 分区表 为了对表进行合理的管理以及提高查询效率,Hive可以将表组织成“分区”。一个分区实际上就是表下的一个目录,一个表可以在多个维度上进行分区,分区之间的关系就是目录树的关系。 通过PARTITIONED BY子句指定,分区的顺序决定了谁是父目录,谁是子目录。 例如:partitioned by(Field1,Field2,…),那么数据在hdfs上的存放路径是:                 默认表路径/Field1=var1/Field=var2 hive分区表有静态分区和动态分区两

qq_34132046的博客 6714

spark saveAsTable insertInto format(“Hive“) 分区表 写入hive 姿势大全

- 执行前OKsss 111-- 执行后OKa 1b 2- 普通表新增 df.write.mode("append").saveAsTable("tb1") //只要用 saveAsTable 这个api. 就需要保证 df和tb1表的 列名(scheme) 相同- 普通表覆盖 df.write.mode("overwrite").saveAsTable("tb1")

yy的博客 867

Spark操作Hive分区表

我的原创地址:https://dongkelun.com/2018/12/04/sparkHivePatition/ 前言 前面学习总结了Hive分区表,现在学习总结一下Spark如何操作Hive分区表,包括利用Spark DataFrame创建Hive的分区表和Spark向已经存在Hive分区表里插入数据,并记录一下遇到的问题以及如何解决。 1、Spark创建分区表 只写主要代码,完整代码见附录......

主要分享大数据相关的知识,如Spark、Hudi 1万+

Hive分区表

1、为什么设立分区表 在大量数据需要查询时,虽然可以通过where进行筛选,但也是检索整个数据表后得到的结果。 而将一个大的数据集根据实际需要分割成各个小型数据集,再通过where选择需要查询的分区, 故而效率大大提高。 2、分区表实质 Hive中的分区是将一个文件分割成各个目录(文件)。 3、分区表语法 3.1建立分区表 create table 分区表名称( 字段名称1 数据类型, 字段名称2 数据类型, 。。。 字段名称n 数据类型 ) partitioned by(分区

weixin_44246850的博客 3791

【深度学习基础】Temporal Fusion Transformer

从下向上看:全连接(Dense) → ELU(指数线性激活函数(比relu好点,有利于模型收敛)) → 全连接(Dense) → 门控线性单元(Gate)(Gated Linear Units (GLUs)) → Layernorm。:一方面,它可以进行静态上下文变量和动态变量的融合,另一方面,通过门控进行了特征选择操作,门控体现在GLU(门控线性单元)中,用了sigmoid控制信息的通过程度,具有良好的适应性,能够自动选择有效信息,自适应地调整网络复杂性。输入:主输入,可选的上下文向量c。

weixin_41838721的博客 1228

【Hive】Hive分区表

分区作为一种提高数据操作灵活性的手段,被广泛应用于关系型数据库中。在Hive中我们同样可以采用分区的方式来提高数据操作效率,和关系型数据库(如Oracle)所不同,Hive的分区表既可以是内部表,也可以是外部表。本篇文章主要介绍如何在Hive中创建分区表,外部表上的DDL操作,以及使用外部表的注意事项。 1. 创建分区表 1.1 创建内部分区表 create table myhive.test_internal(id int) partitioned by (date string) row format

Just Do IT 729

芒果YOLO11改进23:主干Backbone篇GhostNet:原创改进高效 GhostNet 网络,华为出品,打造全新检测器

主干Backbone篇GhostNet:原创改进高效 GhostNet 网络,华为出品,打造全新检测器

包括YOLOv5、YOLOv7、YOLOv8等模型改进 406

2023华为od机试C卷【最富裕的小家庭】Java&Go 实现

在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为个小家庭。现给你一颗树,请计算出最富裕的小家庭的财富和。

MISAYAONE的博客 1904

hive 分区表创建

为了对表进行合理的管理以及提高查询效率,Hive可以将表组织成“分区”。一个分区实际上就是表下的一个目录,一个表可以在多个维度上进行分区,分区之间的关系就是目录树的关系。 1、创建分区表 通过PARTITIONED BY子句指定,分区的顺序决定了谁是父目录,谁是子目录。 创建有一个分区的分区表: CREATE TABLE IF NOT EXISTS part_test( c1 string ,c2 string ,c3 string ,c4 string )P

qq_45602114的博客 2万+

21天教你学会PCIe专栏(21)--项目实例:构建一个基于 PCIe 的 NVMe SSD 阵列存储系统

构建一个高性能的 NVMe SSD 阵列存储系统,利用 PCIe 连接多块 NVMe SSD,实现高带宽和低延迟的数据存储。该系统将支持多种存储配置,如 RAID 0、RAID 1 和 RAID 5,以满足不同的性能和可靠性需求。通过上述步骤,你可以构建一个基于 PCIe 的 NVMe SSD 阵列存储系统。这个系统能够提供高带宽和低延迟的数据存储,并支持多种 RAID 配置以满足不同的性能和可靠性需求。

xiaoheshang_123的博客 200

Hive之分区表

Hive之分区表

优快云2022博客之星Top39;华为云博主7&,优快云、稀土掘金、微信公众号、阿里云开发者社区、腾讯云社区、博客园、知乎、51CTO同名博主WHYBIGDATA; 1618

HBase骚操作之数据加载方式BulkLoad

本文研究了一种HBase BulkLoad的入库方式,该方式利用HBase的数据信息按照特定格式存储在hdfs内这一原理,直接在HDFS中生成持久化的HFile数据格式文件,然后上传至合适位置,即完成巨量数据快速入库的办法。该方式配合MapReduce完成,高效便捷,而且不占用Region资源,增添负载,在大数据量写入时能极大的提高写入效率,并降低对Hbase节点的写入压力。HBase BulkLoad对于异构数据源的合并及大量数据一次性导入具有重要指导意义,相比HBase Put操作在性能上具有较高的优势

石榴姐yyds 7791

Boot过程相关镜像详解:IVT、DCD、App Boot镜像到底是什么?

S32系列芯片中常说的IVT镜像、DCD镜像等跟Boot过程相关的镜像到底是什么,镜像结构长啥样?各镜像作用是什么?主分区和备份区的概念?答案统统在这里!!

车载系统攻城狮 4255

Hive基础之分区表

QQ购买平台

iqifenxia的博客 5218

FPGA实现串口升级及MultiBoot(九)BPI FLASH相关实例演示

与SPI相关知识并没有什么太多区别(别杠硬件或者架构上),相关知识点都在上面指出,大家有什么其他需要注意点,欢迎留言讨论。关于“四样错误”就不演示了,没什么太大区别,下一讲我们开始串口升级。PS:为了扩展ICAPE2原语的使用,在原来的基础上增加了几个常用FPGA ID,并在触发启动时候增加了可选电平触发或上升/下降沿触发(例化IP时选择),新版本号V1.1。

OpenFPGA的博客 1446

Hive 的分区表是什么?

前言 本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系 正文 hive 分区表的概念 在文件系统上建立文件夹,把表的数据放在不同文件夹下面,加快查询速度。 hive 分区表的构建 创建一个分区字段的分区表 hive> create table student_partition1( id int, name string, ag

Shockang的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Hive的分区表入门

什么是分区表: 数据分区的概念以及存在很久了,通常使用分区来水平分散压力,将数据从物理上移到和使用最频繁的用户更近的地方,以及实现其目的。 hive中有分区表的概念,我们可以看到分区具重要性能优势,而且分区表还可以将数据以一种符合逻辑的方式进行组织,比如分层存储 分区表分别有静态分区和动态分区 在大数据中,最常用的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一...

王傲旗的大数据之路 4918

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Hadoop之Hive的分区表

????前几天的课程我们学习了Hive数据的导入、导出、查询和排序,有兴趣的小伙伴可以查看以往的文章????: 第一篇: Hadoop之Hive数据的导入与导出(DML). 第二篇: Hadoop之Hive查询语句. 第三篇:Hadoop之Hive的7种Join语句. 第四篇: Hadoop之Hive的排序. ❗️❗️❗️ 今天要介绍的内容在Hive中非常重要,即分区表 分区表1.分区表1.1 分区表的建立1.2 查询分区表中数据1.3 增加分区1.4 删除分区1.5 查看分区1.6 查看分区表结构2.

柳小葱的博客 4147

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Hive分区表的创建使用

分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。 Hive 建分区表语句: create table dept_partition( deptno int, dname string, loc string ) partitioned by (month string) row for

DaiSnow的博客 3488

hive中分区表的创建

hive中分区表的创建 神罗天征-长门 2019-08-11 17:10:07 7676 收藏 5 分类专栏: hive hadoop 版权 1>开启分区 set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict; 否则会出抛出异常: 2>创建分区表 创建静态分区表: create table test_part_table( word string, num bi...

cxu123321的博客 9637

【Hive】Hive分区表详解

本篇主要演示分区表的创建、插入、动态分区等内容。一 实验环境1 Hive环境0: jdbc:hive2://localhost:10000/hive> select version() ver; +--------------------------------------------------+ | ver ...

个人公众号:Alen的数据库学习笔记 2025
上一篇: 导入数据到hive外部表
下一篇: Phoenix与SpringJDBCTemplate的集成
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值