实训1:分区表

  • 时间:
  • 来源:互联网
  • 文章标签:

一、创建表

image-20210629091910423

二、加载数据

image-20210629093039095

一步到位,将所有txt文件放在一个文件夹中。

补充:truncate table tableName;用来删除相关表中数据

三、查询数据

image-20210629093219016

四、过渡任务:

现要求查询role_main主要定位是射手并且hp_max最大生命大于6000的有几个

sql语句如下:

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

image-20210629094147846

image-20210629094616623

1.where语句的背后需要进行全表扫描才能过滤出结果,对于hive来说需要扫描每一个文件。如果数据文件个数特别多的话,扫描效率很慢也没必要。

2.本需求中,只需要扫描archer.txt文件即可,如何优化可以加快查询,减少全表扫描呢?

3.指定文件扫描和全表扫描,效率还是存在差异的。

五、如何优化加快查询呢?

当Hive表对应的数据量大、文件个数多时,为了避免查询时全表扫描数据,Hive支持根据指定的字段对表进行分区。

第一步创建分区表:

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';

image-20210629095755056

第二步向分区表中加载数据——静态加载:

load data local inpath '路径' into table t_all_hero_part partition(role='sheshou');
load data local inpath '路径' into table t_all_hero_part partition(role='cike');
load data local inpath '路径' into table t_all_hero_part partition(role='fashi');
load data local inpath '路径' into table t_all_hero_part partition(role='fuzhu');
load data local inpath '路径' into table t_all_hero_part partition(role='tanke');
load data local inpath '路径' into table t_all_hero_part partition(role='zhanshi');

补充:如何删除分区表:alter table table_name drop partition(role='sheshou'),partition(role='cike');

第三步查询分区表验证是否映射成功

image-20210629105408367

第四步查询role_main主要定位是射手并且hp_max最大生命大于6000的有几个

select count(*) from t_all_hero_part where role='sheshou' and hp_max>6000;

六、分区表的本质

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

七、分区表数据加载——动态加载

静态分区表加载的时候需要输入多条load命令进行加载很麻烦,现在有一种动态加载的方法,所谓动态分区指的是分区的字段值是基于查询结果(参数位置)自动推断出来的。核心语法就是insert+select

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

set hive.exec.dynamic.partition=true;

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

1、创建一张新的分区表 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';

2、执行动态分区别插入

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

image-20210629113309804

3、查询动态分区表

image-20210629113520209

八、分区表的优点

查询过滤的时候只需要根据分区值找到对应的文件夹,扫描本文件夹下本分区下的文件即可,避免全表数据扫描

3、查询动态分区表

[外链图片转存中…(img-KBeXE8n1-1625061029280)]

八、分区表的优点

查询过滤的时候只需要根据分区值找到对应的文件夹,扫描本文件夹下本分区下的文件即可,避免全表数据扫描

本文链接http://www.taodudu.cc/news/show-2483345.html