Hive數(shù)據(jù)庫join操作雷區(qū)
基礎(chǔ)操作測試
首先準備兩張表收入表 hive_join_gaap_test 和 信息表 hive_join_pl_test,表內(nèi)容如下:
select * from hive_join_pl_test;

hive_join_pl_testselect * from hive_join_gaap_test;

hive_join_gaap_test
1、LEFT OUTER JOIN
select a.clid, a.pid, b.pid, b.plname, a.gaap from hive_join_gaap_test a left outer join hive_join_pl_test b on a.pid = b.pid;

LEFT OUTER JOIN
1)若右表連接key沒有重復,行數(shù)等于左表;
2)若右表連接key有重復,則左表相關(guān)key行數(shù)就會 * 重復次數(shù);所以,這里是個巨坑。左連接右表的key不能重復。
3)以左表key為基礎(chǔ),包含左表全部行,匹配不到左表key及其他字段為NULL,這很基礎(chǔ)不講了。
2、RIGHT OUTER JOIN
select a.clid, a.pid, b.pid, b.plname, a.gaap from hive_join_gaap_test a right outer join hive_join_pl_test b on a.pid = b.pid;

RIGHT OUTER JOIN
注:與左連接正好相反,沒什么好講的。切記,左連接右表的key不能重復,右連接左表的key不能重復,否則基礎(chǔ)表相關(guān)key行數(shù)就會 * 信息表key重復次數(shù)。
3、INNER JOIN
select a.clid, a.pid, b.pid, b.plname, a.gaap from hive_join_gaap_test a inner join hive_join_pl_test b on a.pid = b.pid;

INNER JOIN
1)兩表key交集以外的行會被去除,這么什么好講的,inner join精髓就是取交集,往往用來過濾信息表key以外的收入;
2)兩表key取笛卡爾積,若信息表key重復,收入依然會 * 信息表key重復次數(shù)。
4、JOIN
select a.clid, a.pid, b.pid, b.plname, a.gaap from hive_join_gaap_test a join hive_join_pl_test b on a.pid = b.pid;

JOIN
注:和 INNER JOIN 一樣,不再贅述;Hive 不支持 / LEFT INNER JOIN / RIGHT INNER JOIN.
5、FULL OUTER JOIN
select a.clid, a.pid, b.pid, b.plname, a.gaap from hive_join_gaap_test a full outer join hive_join_pl_test b on a.pid = b.pid;

FULL OUTER JOIN
由上可見,連接操作雷區(qū)有兩個:
1)四種連接,首先要清楚取交集、左集合、右集合、還是并集,清楚哪些行會被去除。
2)若信息表key重復,則根據(jù)笛卡爾積,收入表就會乘以相應key重復次數(shù)。
作者:朝思暮巷
鏈接:https://www.jianshu.com/p/677120c48cfc
