hive SQL优化的简单总结:

1.尽量不要使用select * from,虽代码简单,但会增加资源的使用,触发或依赖有变动时候,须核准字段;

2.除非是必要的计算,否则尽量减少使用函数;

3.distinct,使用逻辑简单,但会全表扫描,如果是大表的情况下,有索引,尽量不使用distinct;

4.多个union all 的使用,可以分写几个insert into,速度更快;

5.如果计算比较复杂,写在1个查询或建表语句中会导致速度变慢,语法错误的概率也会大大增加,可以分多个中间表计算;

6.查询时只读取需要的字段和需要的分区;

7.join操作时,做为主表进行关联,速度更快;

8.多张表join时,尽量保持key相同;

9.大表创建索引时候,可以提高查询效率,但插入或更新数据时,需要维护索引,降低效率,也会占用存储空间;

10.后续补充;

数据倾斜总结:

造成的不良影响:花费的时间长,失去了分布式计算的优势,资源分配不均,不能够负载均衡,小块的数据快速跑完,大块的数据由于资源不足而挂掉,导致整个任务失败。

在spark中的表现:某个stage的有几个task跑得比大部分task都慢很多。

数据倾斜的几种方式:分区不均导致某几个分区对应的key太多;单个key对应的数据量太多;单条记录数据太大。

解决方法:

1.增加并行度,设置shuffle的并行度,大部分情况都使用这个,也可以在倾斜的stage之前使用reparation重分区;

2.处理特殊case,比较常见,倾斜的key可通过group by key进行count寻找,一般是空值、空字符串、还有特别热点的key,处理方式看业务需求;

3.利用小trick打散key,针对单个key对应的数据量太多,可在key上加随机前缀或后缀将一个key变成多个key先进行一次shuffle,最后再还原回来;

4.自定义分区方案,看当前的业务允不允许了,选分块更均匀的分区,可减少数据倾斜的可能。