1. 使用map-join
mapJoin通常用于一个很小的表和一个大表进行join的场景,小表大小由参数hive.mapjoin.smalltable.filesize来决定,该参数表示小表的总大小,默认值为25000000字节,即25M。 假设a表为一张大表,b为小表,并且hive.auto.convert.join=true,那么Hive在执行时候会自动转化为MapJoin。MapJoin简单说就是在Map阶段将小表数据从 HDFS 上读取到内存中的哈希表中,读完后将内存中的哈希表序列化为哈希表文件,在下一阶段,当 MapReduce 任务启动时,会将这个哈希表文件上传到 Hadoop 分布式缓存中,该缓存会将这些文件发送到每个 Mapper 的本地磁盘上。因此,所有 Mapper 都可以将此持久化的哈希表文件加载回内存,并像之前一样进行 Join。顺序扫描大表完成Join。减少昂贵的shuffle操作及reduce操作。
2.join优化
当对三个或者更多个表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个mapreduce job。hive会假定查询中最后一个表为最大的那个表,在对每行记录进行连接操作时,它会尝试将其他表缓存起来,然后扫描最后那个表进行计算。因为,我们可以保证连续查询的表的大小从左到右是依次增加的。
或者可以使用/*+STREAMTABLE(s)*/,hive便会告知优化器哪张表是大表。
版权声明:本文为weixin_44702289原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。