1.Hive表优化
1.1 分区
分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在, 但是该字段不存放实际的数据内容,仅仅是分区的表示(伪列)。
1.1.1静态分区
create table if not exists tablename(id int,name string,tel string)
partitioned by(dt string)
row format delimited
fields terminated by '\t'
stored as textfile;
1.1.2动态分区
使用动态分区前,需要配置以下参数:
hive.exec.dynamic.partition:在DML/DDL中是否支持动态分区,配置为true
hive.exec.dynamic.partition.mode:默认strict,在strict模式下,动态分区的使用必须在一个静态分区确认的情况下,其他分区可以是动态,可以考虑配置成nostrict。
1.2 分桶
使用分桶前,需要配置以下参数:
hive.enforce.bucketing:数据分桶是否被强制执行,默认false,如果开启,则写入table数据时会启动分桶。
hive.enforce.sorting:开启强制排序时,插数据到表中会进行强制排序,默认false;
对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是 针对某一列进行桶的组织。Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。
2. Hive查询优化
2.1 join优化
2.1.1 和数据倾斜有关的优化:
hive.optimize.skewjoin:是否优化数据倾斜的 Join,对于倾