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

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

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

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

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

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

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

(1)创建静态分区表。

sql 复制代码
hive> 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号部门的员工数据,并插入到分区表中,如下图所示。

sql 复制代码
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)启动动态分区。

sql 复制代码
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建立单字段动态分区表。

sql 复制代码
hive> create table dynamic_part_emp
      (empno int,ename string,sal int)
      partitioned by (job string);

视频讲解如下:

单字段动态分区表
【赵渝强老师】Hive的单字段动态分区表

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

sql 复制代码
hive> insert into table dynamic_part_emp 
      select empno,ename,sal,job from emp;

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

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

sql 复制代码
hive> create table dynamic_part_emp1
      (empno int,ename string,sal int)
      partitioned by (deptno int,job string); 

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

视频讲解如下:

半自动分区表
【赵渝强老师】Hive的半自动动态分区表

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

sql 复制代码
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)创建多字段全动态分区表。

sql 复制代码
hive> create table dynamic_part_emp2
     (empno int,ename string,sal int)
     partitioned by (deptno int,job string);

视频讲解如下:

多字段全动态分区表
【赵渝强老师】Hive的多字段全动态分区表

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

sql 复制代码
hive> insert into table dynamic_part_emp2 
      select empno,ename,sal,deptno,job from emp;

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

相关推荐
AllData公司负责人2 小时前
数据库同步平台|AIIData数据中台实现OceanBase、达梦数据库、OpenGauss、人大金仓、Hive、TDengine 一键接入Doris
大数据·数据库·hive·mysql·oceanbase·tdengine
_Jimmy_5 小时前
SQLAlchemy 复杂 SQL 执行指南与模板库
python·sql
2501_942389556 小时前
特斯拉的车辆摄像头每四天为AI训练集采集的数据量
人工智能·hadoop·zookeeper·oracle·时序数据库·memcache
2601_954916597 小时前
ChatGPT 5.6 深度实践:用 AI 重构云成本治理体系,而不是简单“降本”
人工智能·sql·chatgpt·重构·测试用例
肖永威7 小时前
金仓数据库麒麟环境SQL终端使用入门实践(增删改查篇)
数据库·sql·金仓数据库
山峰哥8 小时前
数据库工程与SQL优化实战指南‌
数据库·sql·oracle·深度优先·宽度优先
AllData公司负责人11 小时前
数据同步平台|AIIData数据中台实现MySQL、Hive、Kafka 一键接入Doris
大数据·数据库·hive·mysql·kafka·实时同步
RestCloud11 小时前
2026数据集成工具最新选型建议:ETL/ELT怎么选,都应该带有什么功能
数据仓库·etl·etlcloud·数据传输·数据同步·数据集成工具·elt
牛奶咖啡1311 小时前
大数据Hadoop运维应用实践——Hadoop大数据平台基础与架构(hadoop伪分布式的安装部署)
大数据·hadoop·分布式·hadoop是什么?有啥用?·hadoop的适用与不适用场景·hadoop伪分布式的安装部署·hadoop分布式存储操作
last_zhiyin11 小时前
一步步上手ETL工具之------Informatica PowerCenter
数据仓库·etl·数据处理·powercenter·informatica