准备两张表:
a表数据:
b表数据:
将a表与b表rank=1的数据进行全连接,最终想要得到这样的结果:
本案例将使用full join连接类型进行演示,并透过full join来反映其它Hive谓词下推通用使用场景,得出普遍结论
1)写法1:
select * from a full join b on a.id=b.id where b.rank=1;
结果如下:
解释:
b表先执行where过滤,过滤后再与a表进行full join,因此,b表中rank=2的数据丢失,结果不符合要求
2)写法2:
select * from a full join b on a.id=b.id and b.rank=1;
结果如下:
解释:
a表与b表互相没有匹配到的数据显示为NULL,数据不会丢失,但数据冗余,结果不符合要求
3)写法3:
select * from a full join (select * from b where rank=1) t on a.id=t.id;
结果如下:
解释:
a表与b表互相没有匹配到的数据显示为NULL,数据不会丢失,也不会冗余,结果符合要求
通过full join案例,我们可以得出Hive谓词下推时的以下结论:
Hive谓词下推详解见文章:传送门