Hive中map-join 和 reduce-join

配置

  • hive.auto.convert.join
    0.11版本之后默认是true。
  • hive.mapjoin.smalltable.filesize/hive.smalltable.filesize
    map join通常用于一个很小的表和一个大表进行join的场景,具体小表有多小,由参数 hive.mapjoin.smalltable.filesize来决定,该参数表示小表的总大小,默认值为25000000字节,即25M。 一般默认就够了,无须修改。

map-join

Hive中map-join 和 reduce-join

  • 说明:
    • hive会自动选择小表(元数据中会有记录,知道哪个表示大表还是小表),然后cache的各个节点上。然后直接与关联的表进行map,没有reduce操作,也就没有shuffle。但是需要保证内存充足。
    • 若所有表中只有一张小表,那可在最大的表通过Mapper的时候将小表完全放到内存中,Hive可以在map端执行连接过程,称为map-side join,这是因为Hive可以和内存的小表逐一匹配,从而省略掉常规连接所需的reduce过程。即使对于很小的数据集,这个优化也明显地要快于常规的连接操作。其不仅减少了reduce过程,而且有时还可以同时减少Map过程的执行步骤。
    • 其适用于小表JOIN大表的场景,由于表的JOIN操作是在Map端且在内存进行的。

reduce-join

Hive中map-join 和 reduce-join

  • 说明:
    • 别称shuffle join、common join
    • Map阶段
      读取源表的数据,Map输出时候以Join on条件中的列为key,如果Join有多个关联键,则以这些关联键的组合作为key;
      Map输出的value为join之后所关心的(select或者where中需要用到的)列;同时在value中还会包含表的Tag信息,用于标明此value对应哪个表;
      按照key进行排序
    • Shuffle阶段
      根据key的值进行hash,并将key/value按照hash值推送至不同的reduce中,这样确保两个表中相同的key位于同一个reduce中
    • Reduce阶段
      根据key的值完成join操作,期间通过Tag来识别不同表中的数据。