【赵渝强老师】Hive的分区表

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: Hive的分区表与Oracle、MySQL类似,通过分区条件将数据分隔存储,提高查询效率。本文介绍了静态分区表和动态分区表的创建与使用方法,包括具体SQL语句和执行计划分析,附带视频讲解。静态分区表需显式指定分区条件,而动态分区表则根据插入数据自动创建分区。

b141.png

Hive的分区表跟Oracle、MySQL中分区表的概念是一样的。当表上建立了分区,就会根据分区的条件从物理存储上将表中的数据进行分隔存储。而当执行查询语句时候,也会根据分区的条件扫描特定分区中的数据,从而避免全表扫描以提高查询的效率。Hive分区表中的每个分区将会在HDFS上创建一个目录,分区中的数据则是该目录下的文件。在执行查询语句时,可以通过SQL的执行计划了解到是否在查询的时候扫描的特定的分区。


视频讲解如下:


注意:Hive的分区表具体又可以分为:静态分区表和动态分区表。


一、实战使用Hive的静态分区表


静态分区表需要在插入数据的时候显式指定分区的条件。下面通过具体的步骤来演示如何创建并使用Hive的静态分区表。视频讲解如下:


(1)创建静态分区表。

create table emp_part
(empno int,
ename string,
job string,
mgr int,
hiredate string,
sal int,
comm int)
partitioned by (deptno int)
row format delimited fields terminated by ',';


(2)往静态分区表中插入数据时,需要指定具体的分区条件。下面的语句使用了三条insert语句分别从内部表中查询出了10、20和30号部门的员工数据,并插入到分区表中,如下图所示。

hive> insert into table emp_part partition(deptno=10) 
    select empno,ename,job,mgr,hiredate,sal,comm from emp where deptno=10;
hive> insert into table emp_part partition(deptno=20) 
    select empno,ename,job,mgr,hiredate,sal,comm from emp where deptno=20;
hive> insert into table emp_part partition(deptno=30) 
    select empno,ename,job,mgr,hiredate,sal,comm from emp where deptno=30;



(3)通过explain语句查看SQL的执行计划,如查询10号部门的员工信息。通过执行计划,可以看出扫描的数据量大小是118B。如下图所示。


(4)下图是查询普通的内部表的执行计划,可以看出扫描的数据量大小是6290B。

 

二、实战使用Hive的动态分区表


动态分区表则可以根据插入的数据动态建立分区。下面通过具体的步骤来演示如何创建并使用Hive的动态分区表。

注意:Hive的动态分区表默认使用最后一个字段作为分区名,需要分区的字段只能放在后面,不能把顺序弄错。向动态分区表中插入数据时,Hive是根据查询字段的位置推断分区名的,而不是字段名称。


(1)启动动态分区。

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

注意:参数hive.exec.dynamic.partition的默认值是false,表示禁用动态分区功能;参数hive.exec.dynamic.partition.mode的默认值是strict,表示必须有静态分区字段。

 

(2)据员工的job建立单字段动态分区表。

hive> create table dynamic_part_emp
     (empno int,ename string,sal int)
      partitioned by (job string);


视频讲解如下:


(3)向dynamic_part_emp分区表中插入数据。

hive> insert into table dynamic_part_emp 
     select empno,ename,sal,job from emp;

注意:这里将会使用查询语句的最后一个字段job作为动态分区的条件。

 

(4)创建半自动分区表。

hive> create table dynamic_part_emp1
     (empno int,ename string,sal int)
      partitioned by (deptno int,job string);

注意:半自动分区表是指部分字段采用静态分区,而另一部分自动采用动态分区,且静态分区字段要在动态分区前面。


视频讲解如下:


(5)向dynamic_part_emp1分区表中插入数据。

hive> insert into table dynamic_part_emp1 partition(deptno=10,job) 
      select empno,ename,sal,job from emp where deptno=10;

注意:由于部门号deptno采用静态分区,因此需要在插入数据的时候指定deptno作为静态分区的条件;而这里的job采用的动态分区。


(6)创建多字段全动态分区表。

hive> create table dynamic_part_emp2
     (empno int,ename string,sal int)
      partitioned by (deptno int,job string);


视频讲解如下:


(7)向dynamic_part_emp2分区表中插入数据。

hive> insert into table dynamic_part_emp2 
    select empno,ename,sal,deptno,job from emp;

注意:这里会根据deptno和job两个字段来创建动态分区。


相关文章
|
1月前
|
SQL 分布式计算 Java
【赵渝强老师】Hive的体系架构
Hive是基于Hadoop的数据仓库平台,提供SQL-like的HQL语言进行数据分析,无需编写复杂的Java代码。Hive支持丰富的数据模型,可将SQL语句转换为MapReduce任务在Yarn上运行,底层依赖HDFS存储数据。Hive可通过CLI、JDBC和Web界面执行SQL查询。
|
1月前
|
SQL 存储 关系型数据库
【赵渝强老师】Hive的内部表与外部表
Hive是基于HDFS的数据仓库,支持SQL查询。其数据模型包括内部表、外部表、分区表、临时表和桶表。本文介绍了如何创建和使用内部表和外部表,提供了详细的步骤和示例代码,并附有视频讲解。
|
SQL 存储 分布式计算
Hive学习---5、分区表和分桶表
Hive学习---5、分区表和分桶表
|
7月前
|
SQL 存储 传感器
Hive中的分区表和非分区表有什么区别?请解释其作用和使用场景。
Hive中的分区表和非分区表有什么区别?请解释其作用和使用场景。
245 0
|
SQL 文件存储 数据库
Hive分区表的新增字段数据为null的问题解决方法
Hive分区表的新增字段数据为null的问题解决方法
361 0
|
SQL 存储 数据采集
Hive 分区表和分桶表
Hive 分区和分桶的区别
183 0
|
SQL HIVE
Hive创建分区表常用指令
Hive创建分区表常用指令
521 0
|
SQL 大数据 Apache
Apache Hive--DDL--创建表--分区表创建| 学习笔记
快速学习 Apache Hive--DDL--创建表--分区表创建
116 0
Apache Hive--DDL--创建表--分区表创建| 学习笔记
|
SQL 分布式计算 Hadoop
Hive分区表简介
如果一个表中数据很多,我们查询时就很慢,耗费大量时间,如果要查询其中部分数据该怎么办呢,这时我们引入分区的概念。 Hive中的分区表分为两种:静态分区和动态分区。
273 0
|
SQL 存储 数据库
hive分区表
Partition 对应于数据库的 Partition 列的密集索引 在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中 例如: test表中...
1196 0