鎖屏面試題百日百刷-Hive篇(六)
? ?鎖屏面試題百日百刷,每個(gè)工作日?qǐng)?jiān)持更新面試題。鎖屏面試題app、小程序現(xiàn)已上線,官網(wǎng)地址:https://www.demosoftware.cn。已收錄了每日更新的面試題的所有內(nèi)容,還包含特色的解鎖屏幕復(fù)習(xí)面試題、每日編程題目郵件推送等功能。讓你在面試中先人一步!接下來(lái)的是今日的面試題:
1.Hive join查詢(xún)的時(shí)候on和where有什么區(qū)別
左右關(guān)聯(lián)時(shí):
? 條件不為主表?xiàng)l件時(shí),放在on和where后面一樣
? 條件為主表?xiàng)l件時(shí),放在on后面,結(jié)果為主表全量,放在where后面為主表?xiàng)l件篩選過(guò)后的全量。
-- 1. select * from a left join b on a.id=b.id and a.dt=20181115; -- 2.select * from a left join b on a.id=b.id and b.dt=20181115; -- 3.select * from a join b on a.id=b.id and a.dt=20181115; -- 4.select * from a left join b on a.id=b.id where?a.dt=20181115; -- sql1: 如果是left join 在on 上寫(xiě)主表a的條件不會(huì)生效,全表掃描。
-- sql2: 如果是left join 在 on 上寫(xiě)副表b的條件會(huì)生效,但是語(yǔ)義與寫(xiě)到where條件不同。
-- sql3: 如果是inner join 在on 上寫(xiě)主表a,副表b的條件都會(huì)生效。
-- sql4: 建議這么寫(xiě),大家寫(xiě)sql 大部分的語(yǔ)義都是先過(guò)濾數(shù)據(jù)然后再join,所以在不了解 join on +條件的情況下,條件盡量別寫(xiě)到on后
2.Hive里面的left join是怎么執(zhí)行的?
不考慮where條件下,left join會(huì)把左表所有數(shù)據(jù)查詢(xún)出來(lái),on及其后面的條件僅僅會(huì)影響右表的數(shù)據(jù)(符合就顯示,不符合全部為null)。
在join階段。where字句的條件都不會(huì)被使用,僅在join階段完成以后,where子句條件才會(huì)被使用,它將從匹配階段產(chǎn)生的數(shù)據(jù)中檢索過(guò)濾。
所以左連接關(guān)注的是左邊的主表數(shù)據(jù),不應(yīng)該把on后面的從表中的條件加到where后,這樣會(huì)影響原有主表的數(shù)據(jù)。
where后面:是先連接生成臨時(shí)查詢(xún)結(jié)果,然后再篩選on后面:先根據(jù)條件過(guò)濾篩選,再連接生成臨時(shí)查詢(xún)結(jié)果。
對(duì)于條件在on加個(gè)and還是用子查詢(xún)。查詢(xún)結(jié)果是一模一樣的,至于如何使用這個(gè)需要分情況,用子查詢(xún)的話會(huì)多一個(gè)maptask,但是如果利用這個(gè)子查詢(xún)能過(guò)濾很多數(shù)據(jù)的話,用子查詢(xún)還是比較建議的,因?yàn)椴粫?huì)加載太多的數(shù)據(jù)到內(nèi)存中,如果過(guò)濾數(shù)據(jù)不多的情況下,建議用on后面加and條件。
3.Hive內(nèi)部表,外部表,分區(qū)表
1.內(nèi)部表
? 與數(shù)據(jù)庫(kù)中的Table在概念上是類(lèi)似的。
? 每一個(gè)Table在Hive中都有一個(gè)相應(yīng)的目錄存儲(chǔ)數(shù)據(jù)。
? 所有的Table數(shù)據(jù)(不包括 External Table)都保存在這個(gè)目錄中。
? 刪除表時(shí),元數(shù)據(jù)與數(shù)據(jù)都會(huì)被刪除。
2.外部表
? 指向已經(jīng)在HDFS中存在的數(shù)據(jù),可以創(chuàng)建Partition。
? 它和內(nèi)部表在元數(shù)據(jù)的組織上是相同的,而實(shí)際數(shù)據(jù)的存儲(chǔ)則有較大的差異。
? 外部表只有一個(gè)過(guò)程,加載數(shù)據(jù)和創(chuàng)建表同時(shí)完成,并不會(huì)移動(dòng)到數(shù)據(jù)庫(kù)目錄中,只是與外部數(shù)據(jù)建立一個(gè)連接,當(dāng)刪除一個(gè)外部表時(shí),僅刪除連接和元數(shù)據(jù)。
3.分區(qū)表
? Partition 對(duì)應(yīng)于數(shù)據(jù)庫(kù)的Partition列的密集索引。
? 在Hive中,表中的一個(gè)Partition對(duì)應(yīng)于表下的一個(gè)目錄,所有的Partition的數(shù)據(jù)都存儲(chǔ)在對(duì)應(yīng)的目錄中。