HIVE的HQL语句优化原理

优化的核心在于 处理大数据量 与 hive执行过程原理

  1. 用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;
  1. 左半开连接
    可以代替in,速度会比较快。
    SEMI JOIN

  2. 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;

原文地址:https://www.cnblogs.com/xinlingyue-blog/p/5485063.html