Join与filter的顺序
根据官方文档的说法,join发生在前,filter发生在后。所以如果这样写join sql则会先将整个表join然后在按照where条件过滤:
1 2 |
SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key) WHERE a.ds='2009-07-07' AND b.ds='2009-07-07' |
显然这样背离了初衷。正确的写法应该是:
1 2 |
SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key AND b.ds='2009-07-07' AND a.ds='2009-07-07') |
两种写法虽然感觉是一样的意思,理论上计算出来的结果应该也是一样。但通过实际应用,发现结果居然是不一样的,两者的结果数量可能会相差一个数量级以上,而输出正确的是第二种写法。至于为何第一种写法会出现不一样的结果,等有时间了在研究下。感觉应该是数据的问题,而不是hive有bug。
从日志也可以看到两种语句的map数量不一样,第一种会扫描全表,而第二种只扫描where条件中的特定的partition。