01

分区表的引入、产生背景

现有6份数据文件,分别记录了《王者荣耀》中6种位置的英雄相关信息。现要求通过建立一张表t_all_hero,把6份文件同时映射加载。

create table t_all_hero(id int,name string,hp_max int,mp_max int,attack_max int,defense_max int,attack_range string,role_main string,role_assist string
)
row format delimited
fields terminated by "\t";

加载数据文件到HDFS指定路径下:

现要求查询role_main主要定位是射手并且hp_max最大生命大于6000的有几个,sql语句如下:

select count(*) from t_all_hero where role_main="archer" and hp_max >6000;

思考一下:where语句的背后需要进行全表扫描才能过滤出结果,对于hive来说需要扫描表下面的每一个文件。如果数据文件特别多的话,效率很慢也没必要。本需求中,只需要扫描archer.txt文件即可,如何优化可以加快查询,减少全表扫描呢?

点击文末阅读原文,无须下载直接在线学习~

02

分区表的概念、创建

当Hive表对应的数据量大、文件多时,为了避免查询时全表扫描数据,Hive支持根据用户指定的字段进行分区,分区的字段可以是日期、地域、种类等具有标识意义的字段。比如把一整年的数据根据月份划分12个月(12个分区),后续就可以查询指定月份分区的数据,尽可能避免了全表扫描查询。

分区表建表语法:

CREATE TABLE table_name (column1 data_type, column2 data_type) PARTITIONED BY (partition1 data_type, partition2 data_type,….);

针对《王者荣耀》英雄数据,重新创建一张分区表t_all_hero_part,以role角色作为分区字段。

create table t_all_hero_part(id int,name string,hp_max int,mp_max int,attack_max int,defense_max int,attack_range string,role_main string,role_assist string
) partitioned by (role string)
row format delimited
fields terminated by "\t";

需要注意:分区字段不能是表中已经存在的字段,因为分区字段最终也会以虚拟字段的形式显示在表结构上。

03

分区表数据加载--静态分区

所谓静态分区指的是分区的字段值是由用户在加载数据的时候手动指定的。

语法如下:

load data [local] inpath ' ' into table tablename partition(分区字段='分区值'...);

Local表示数据是位于本地文件系统还是HDFS文件系统。关于load语句后续详细展开讲解。

静态加载数据操作如下,文件都位于Hive服务器所在机器本地文件系统上。

load data local inpath '/root/hivedata/archer.txt' into table t_all_hero_part partition(role='sheshou');
load data local inpath '/root/hivedata/assassin.txt' into table t_all_hero_part partition(role='cike');
load data local inpath '/root/hivedata/mage.txt' into table t_all_hero_part partition(role='fashi');
load data local inpath '/root/hivedata/support.txt' into table t_all_hero_part partition(role='fuzhu');
load data local inpath '/root/hivedata/tank.txt' into table t_all_hero_part partition(role='tanke');
load data local inpath '/root/hivedata/warrior.txt' into table t_all_hero_part partition(role='zhanshi');

04

分区表数据加载--动态分区

往hive分区表中插入加载数据时,如果需要创建的分区很多,则需要复制粘贴修改很多sql去执行,效率低。因为hive是批处理系统,所以hive提供了一个动态分区功能,其可以基于查询参数的位置去推断分区的名称,从而建立分区。

所谓动态分区指的是分区的字段值是基于查询结果自动推断出来的。核心语法就是insert+select。

启用hive动态分区,需要在hive会话中设置两个参数:

set hive.exec.dynamic.partition=true;

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

第一个参数表示开启动态分区功能,第二个参数指定动态分区的模式。分为nonstick非严格模式和strict严格模式。strict严格模式要求至少有一个分区为静态分区。

创建一张新的分区表t_all_hero_part_dynamic

create table t_all_hero_part_dynamic(id int,name string,hp_max int,mp_max int,attack_max int,defense_max int,attack_range string,role_main string,role_assist string
) partitioned by (role string)
row format delimited
fields terminated by "\t";

执行动态分区插入

insert into table t_all_hero_part_dynamic partition(role) select tmp.*,tmp.role_main from t_all_hero tmp;

动态分区插入时,分区值是根据查询返回字段位置自动推断的。

05

分区表的本质

外表上看起来分区表好像没多大变化,只不过多了一个分区字段。实际上在底层管理数据的方式发生了改变。这里直接去HDFS查看区别。

非分区表:t_all_hero

分区表:t_all_hero_part

分区的概念提供了一种将Hive表数据分离为多个文件/目录的方法。不同分区对应着不同的文件夹,同一分区的数据存储在同一个文件夹下。只需要根据分区值找到对应的文件夹,扫描本分区下的文件即可,避免全表数据扫描。

06

分区表的使用

分区表的使用重点在于:

一、建表时根据业务场景设置合适的分区字段。比如日期、地域、类别等;

二、查询的时候尽量先使用where进行分区过滤,查询指定分区的数据,避免全表扫描。

比如:查询英雄主要定位是射手并且最大生命大于6000的个数。使用分区表查询和使用非分区表进行查询,SQL如下:

--非分区表 全表扫描过滤查询
select count(*) from t_all_hero where role_main="archer" and hp_max >6000;
--分区表 先基于分区过滤 再查询
select count(*) from t_all_hero_part where role="sheshou" and hp_max >6000;

想一想:底层执行性能来说,分区表的优势在哪里?

07

分区表的注意事项

一、分区表不是建表的必要语法规则,是一种优化手段表,可选;

二、分区字段不能是表中已有的字段,不能重复;

三、分区字段是虚拟字段,其数据并不存储在底层的文件中;

四、分区字段值的确定来自于用户价值数据手动指定(静态分区)或者根据查询结果位置自动推断(动态分区

五、Hive支持多重分区,也就是说在分区的基础上继续分区,划分更加细粒度

08

多重分区表

通过建表语句中关于分区的相关语法可以发现,Hive支持多个分区字段:PARTITIONED BY (partition1 data_type, partition2 data_type,….)。

多重分区下,分区之间是一种递进关系,可以理解为在前一个分区的基础上继续分区。从HDFS的角度来看就是文件夹下继续划分子文件夹。比如:把全国人口数据首先根据省进行分区,然后根据市进行划分,如果你需要甚至可以继续根据区县再划分,此时就是3分区表。

--单分区表,按省份分区
create table t_user_province (id int, name string,age int) partitioned by (province string);--双分区表,按省份和市分区
create table t_user_province_city (id int, name string,age int) partitioned by (province string, city string);--三分区表,按省份、市、县分区
create table t_user_province_city_county (id int, name string,age int) partitioned by (province string, city string,county string);

多分区表的数据插入和查询使用

load data local inpath '文件路径' into table t_user_province partition(province='shanghai');load data local inpath '文件路径' into table t_user_province_city_county partition(province='zhejiang',city='hangzhou',county='xiaoshan');select * from t_user_province_city_county where province='zhejiang' and city='hangzhou';

Hive分区表:静态分区、动态分区、多重分区介绍相关推荐

  1. 路由 路由分类(IGP与EGP、直连、静态、动态)与路由表介绍

    4.0.0 路由 路由分类(IGP与EGP.直连.静态.动态)与路由表介绍 目录 路由分类 IGP内部网关协议 EGP外部网关协议 直连路由 静态路由 动态路由 路由表 RIB路由表 FIB转发信息表 ...

  2. Hive分区表的使用

    一.静态分区 1.创建一张分区表 create table test_part_table(word string,num bigint )partitioned by(dt string)row f ...

  3. Hive分区(静态分区+动态分区)

    原文地址: https://www.cnblogs.com/yongjian/archive/2017/03/29/6640951.html   Hive分区的概念与传统关系型数据库分区不同.   传 ...

  4. hive静态与动态分区理解

    需要建立一个备份带分区的数据表,拷贝时若采用静态分区方式需要写 N 行语句,因此可以使用动态分区,节省大量时间. Hive 的分区方式:由于 Hive 实际是存储在 HDFS 上的抽象,Hive 的一 ...

  5. Hive之——Hive分区(静态分区+动态分区)

    Hive分区的概念与传统关系型数据库分区不同. 传统数据库的分区方式:就oracle而言,分区独立存在于段里,里面存储真实的数据,在数据进行插入的时候自动分配分区. Hive的分区方式:由于Hive实 ...

  6. 深圳大数据培训:大数据开发之掌握Hive的静态分区与动态分区

    深圳大数据培训:大数据开发之掌握Hive的静态分区与动态分区 分区是hive存放数据的一种方式.将列值作为目录来存放数据,就是一个分区. 这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的 ...

  7. hive的静态分区与动态分区-用法实例

    概述 本文是对[3]的复现 所有的SQL操作都在下方gitee链接中 https://gitee.com/appleyuchi/Flink_Code/blob/master/hive动态静态分区/hi ...

  8. sqoop动态分区导入mysql,sqoop 导入数据到hive分区表(外表,内表) 指定分区 指定数据库 指定表...

    sqoop 导入数据到hive 1.1.导入数据到hive分区表(内表),指定分区 创建hive分区表 –hive-database 指定数据库 –table 指定表 –hive-overwrite ...

  9. hive sqoop 分区导入_利用oozie,执行sqoop action将DB2中的数据导入到hive分区表中

    测试:利用oozie,执行sqoop action将DB2中的数据导入到hive分区表中. 需要注意的地方: 1,要添加hive.metastore.uris这个参数.否则无法将数据加载到hive表中 ...

最新文章

  1. 使用 Java 开发 OpenCV 应用
  2. nginx 学习笔记(2) nginx新手入门
  3. Facebook首席工程负责人胡鲁辉:数字化2.0的理念、架构与业务模型丨鲸犀峰会
  4. erc20 php,使用php将erc20令牌从一个帐户传输到另一个帐户
  5. python 多进程 multiprocessing 进程池 pool apply_async()函数与apply()函数的用法
  6. [Java复习02] 集合框架 Collection
  7. [css] 你用过css的tab-size属性吗?浏览器默认显示tab为几个空格?
  8. win主机上搭建php网站运行环境,Windows server 2008搭建php运行环境图文详解(php5.3)
  9. 磊哥私藏书单分享,160买400的书!
  10. 西瓜书+实战+吴恩达机器学习(十六)半监督学习(半监督SVM、半监督k-means、协同训练算法)
  11. 报错:Ticket expired while renewing credentials 原因:Hue 集成Kerberos 导致Kerberos Ticket Renewer 起不来
  12. python和java哪个好学-java和python哪个的前途更好?
  13. java 输入语句_java怎样输入语句
  14. PhotoShop中批量导出图片
  15. uniCloud开发公众号:一、接收、解析、组装xml消息
  16. ISO26262解析(十)——HSI
  17. Python错误集锦:pandas绘制多个子图时报错:AttributeError: ‘list’ object has no attribute ‘get_figure’
  18. 遥感(1):遥感是什么?
  19. 欧洲服务器与美国服务器哪个比较好呢?
  20. 电话自动拨号自动录音

热门文章

  1. phpstudy和本地数据库共用
  2. 区块链开发公司之未来促进区块链繁荣的五大方法
  3. linux新建组 给组添加用户和删除用户 并给组赋值guid和sticky权限
  4. vue过滤器,日期自动减一天,返回一个自定义日期格式
  5. 联想小新潮7000-14ikbr装机方法【无法用U盘启动的问题
  6. android m4a播放器下载,Android 上传m4a格式音频 本地文件和从服务器下载的文件有差异 一般会有哪些因素导致?...
  7. 盘点国内29款医疗语音产品,精准把握痛点是关键
  8. flex布局的justify-content属性写法注意事项
  9. Win 10 C 盘突然爆满,怎么清理?
  10. poi 不自动计算 设置单元格公式_通过POI自动计算EXCEL中的公式