一、创建表
二、加载数据
一步到位,将所有txt文件放在一个文件夹中。
补充:truncate table tableName;
用来删除相关表中数据
三、查询数据
四、过渡任务:
现要求查询role_main主要定位是射手并且hp_max最大生命大于6000的有几个
sql语句如下:
select count(*) from t_all_hero where role_main='archer' and hp_max>6000;
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';
第二步向分区表中加载数据——静态加载:
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');
第三步查询分区表验证是否映射成功
第四步查询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;
3、查询动态分区表
八、分区表的优点
查询过滤的时候只需要根据分区值找到对应的文件夹,扫描本文件夹下本分区下的文件即可,避免全表数据扫描。
3、查询动态分区表
[外链图片转存中…(img-KBeXE8n1-1625061029280)]
八、分区表的优点
查询过滤的时候只需要根据分区值找到对应的文件夹,扫描本文件夹下本分区下的文件即可,避免全表数据扫描。