HIVE的HQL语句优化原理
优化的核心在于 处理大数据量 与 hive执行过程原理
- 用where过滤分区,可以减小数据量
可以使用嵌套select查询,先用where过滤分区,再进行表连接,这对所有种类的表连接都是可以的。
hive> SELECT s.ymd, s.symbol, s.price_close, d.dividend FROM
> (SELECT * FROM stocks WHERE symbol='AAPL' AND exchange = 'NASDAQ') s
> LEFT OUTER JOIN
> (SELECT * FROM dividends WHERE symbol='AAPL' AND exchange = 'NASDAQ') d
> ON s.ymd = d.ymd;
-
左半开连接
可以代替in,速度会比较快。
SEMI JOIN -
map-side JOIN
原理:在大表通过mapper时,将小表完全放到内存里,在map端执行连接过程,省略掉常规连接操作所需要的reduce过程。
3.1
操作:在$HOME/.hiverc里配置hive.auto.convert.JOIN和smalltable.filesize
限制:不适合左外连接和全连接;大表分桶在一定程度上是可以的
3.2
条件:如果数据表是分桶的,若表中数据按照ON语句中的键进行分桶,而其中一张表的分桶个数必须是另一张表分桶个数的若干倍。
原理:满足这些条件后,Hive在map阶段按照分桶数据进行连接。
3.3
条件:如果所涉及的分桶表都有相同的分桶数,而且数据是按照连接键或桶的键进行排序的
操作:开启更快的分类-合并连接(sort-merge JOIN)。需要设置以下属性:
hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
hive.optimize.bucketmapjoin=true;
hive.optimize.bucketmapjoin.sortedmerge=true;