1 幾種join方式
join
join對(duì)應(yīng)于inner join 內(nèi)連接。
當(dāng)多張表進(jìn)行join的時(shí)候,所有表中與on條件中匹配的數(shù)據(jù)才會(huì)顯示。
hql(即hive sql)的on子句中只支持and,不支持 or,也不支持null的對(duì)比。
left outer join
左外連接,也稱為左連接。
以左表為基準(zhǔn),如果右表有條件匹配的數(shù)據(jù),則顯示,否則顯示為null。
right outer join
與左外連接相反,以右表為基準(zhǔn),若左表有條件匹配的數(shù)據(jù),則顯示,否則顯示為null。
full outer join
全外連接,返回所有表中滿足where條件的數(shù)據(jù),不滿足的以null代替。
left semi join
左半連接,查詢出滿足on條件的左表的數(shù)據(jù)。左表的記錄在右表中找到對(duì)應(yīng)的記錄,則右表停止掃描。
select和where子句不能引用右表的字段。
right semi join
右半連接,類似左半連接。hql不支持right semi join
笛卡爾積
左表數(shù)據(jù)乘以右表數(shù)據(jù)。使用join,(跟內(nèi)連接的區(qū)別貌似是沒有on條件)
union
聯(lián)合操作
2 避免踩坑
left outer join
左外連接的結(jié)果條數(shù)應(yīng)該與左表的條數(shù)一樣多。如果右表關(guān)聯(lián)的字段存在重復(fù)時(shí),會(huì)讓結(jié)果條數(shù)變多。
full outer join
不要把右表的 where條件寫在 on 語句中
join特別慢
reduce階段特別慢,可能發(fā)生數(shù)據(jù)傾斜,或者join on字段存在null值。
select 非null值
做完full outer join后,想要選擇非空的列值作為結(jié)果,可以使用 coalesce。
如
SELECT COALESCE(table1.id, table2.id) AS id,
table1.name,table1.family,table2.orderr,table2.countt
FROM table1 FULL OUTER JOIN table2
ON table1.id = table2.id
(網(wǎng)上還有一種用法是isnull,沒有證實(shí)過
SELECT ISNULL(table1.id, table2.id) AS id,
table1.name,table1.family,table2.orderr,table2.countt
FROM table1 FULL OUTER JOIN table2
ON table1.id = table2.id
)
order by & sort by
order by對(duì)所有數(shù)據(jù)在一個(gè)reduce中全排序。如果設(shè)置hive.mapred.mode=strict,在全排序時(shí)必須結(jié)合limit使用。
sort by 在每個(gè)reduce中進(jìn)行排序(局部排序)