鎖屏面試題百日百刷-Hive篇(八)
? ? 鎖屏面試題百日百刷,每個工作日堅持更新面試題。鎖屏面試題app、小程序現(xiàn)已上線,官網(wǎng)地址:https://www.demosoftware.cn。已收錄了每日更新的面試題的所有內(nèi)容,還包含特色的解鎖屏幕復(fù)習(xí)面試題、每日編程題目郵件推送等功能。讓你在面試中先人一步!接下來的是今日的面試題:
1.Hive 中的壓縮格式TextFile、SequenceFile、RCfile 、ORCfile各有什么區(qū)別?
1. TextFile
默認格式,存儲方式為行存儲,數(shù)據(jù)不做壓縮,磁盤開銷大,數(shù)據(jù)解析開銷大。?可結(jié)合Gzip、Bzip2使用(系統(tǒng)自動檢查,執(zhí)行查詢時自動解壓),但使用這種方式,壓縮后的文件不支持split,Hive不會對數(shù)據(jù)進行切分,從而無法對數(shù)據(jù)進行并行操作。并且在反序列化過程中,必須逐個字符判斷是不是分隔符和行結(jié)束符,因此反序列化開銷會比SequenceFile高幾十倍。
2. SequenceFile
SequenceFile是Hadoop API提供的一種二進制文件支持,,存儲方式為行存儲,其具有使用方便、可分割、可壓縮的特點。
SequenceFile支持三種壓縮選擇:NONE,RECORD,BLOCK。Record壓縮率低,一般建議使用BLOCK壓縮。優(yōu)勢是文件和hadoop api中的MapFile是相互兼容的
3. RCFile
存儲方式:數(shù)據(jù)按行分塊,每塊按列存儲。結(jié)合了行存儲和列存儲的優(yōu)點:
首先,RCFile?保證同一行的數(shù)據(jù)位于同一節(jié)點,因此元組重構(gòu)的開銷很低;
其次,像列存儲一樣,RCFile?能夠利用列維度的數(shù)據(jù)壓縮,并且能跳過不必要的列讀取;
RCFile的一個行組包括三個部分:
第一部分是行組頭部的【同步標識】,主要用于分隔?hdfs?塊中的兩個連續(xù)行組
第二部分是行組的【元數(shù)據(jù)頭部】,用于存儲行組單元的信息,包括行組中的記錄數(shù)、每個列的字節(jié)數(shù)、列中每個域的字節(jié)數(shù)
第三部分是【表格數(shù)據(jù)段】,即實際的列存儲數(shù)據(jù)。在該部分中,同一列的所有域順序存儲。
從圖可以看出,首先存儲了列?A?的所有域,然后存儲列?B?的所有域等。

數(shù)據(jù)追加:RCFile?不支持任意方式的數(shù)據(jù)寫操作,僅提供一種追加接口,這是因為底層的?HDFS當前僅僅支持數(shù)據(jù)追加寫文件尾部。
行組大?。盒薪M變大有助于提高數(shù)據(jù)壓縮的效率,但是可能會損害數(shù)據(jù)的讀取性能,因為這樣增加了?Lazy?解壓性能的消耗。而且行組變大會占用更多的內(nèi)存,這會影響并發(fā)執(zhí)行的其他MR作業(yè)??紤]到存儲空間和查詢效率兩個方面,F(xiàn)acebook?選擇?4MB?作為默認的行組大小,當然也允許用戶自行選擇參數(shù)進行配置。
4. ORCFile
存儲方式:數(shù)據(jù)按行分塊?每塊按照列存儲。
壓縮快?快速列存取。
效率比rcfile高,是rcfile的改良版本
以下為RCFile、TextFile、SequenceFile三種文件的存儲情況:
[hadoop@master ~]$ hadoop dfs -dus /user/Hive/warehouse/* hdfs://master :9000/user/Hive/warehouse/hbase_table_1 0
hdfs://master :9000/user/Hive/warehouse/hbase_table_2 0
hdfs://master :9000/user/Hive/warehouse/orcfile_table 0
hdfs://master :9000/user/Hive/warehouse/rcfile_table 102638073
hdfs://master :9000/user/Hive/warehouse/seqfile_table 112497695
hdfs://master :9000/user/Hive/warehouse/testfile_table 536799616
hdfs://master :9000/user/Hive/warehouse/textfile_table 107308067
[hadoop@singlehadoop ~]$ hadoop dfs -ls /user/Hive/warehouse/*/ -rw-r--r-- 2 hadoop supergroup 51328177 2021-03-20 00:42 /user/Hive/warehouse/rcfile_table/000000_0
-rw-r--r-- 2 hadoop supergroup 51309896 2021-03-20 00:43 /user/Hive/warehouse/rcfile_table/000001_0
-rw-r--r-- 2 hadoop supergroup 56263711 2021-03-20 01:20 /user/Hive/warehouse/seqfile_table/000000_0
-rw-r--r-- 2 hadoop supergroup 56233984 2021-03-20 01:21 /user/Hive/warehouse/seqfile_table/000001_0
-rw-r--r-- 2 hadoop supergroup 536799616 2021-03-19 23:15 /user/Hive/warehouse/testfile_table/weibo.txt -rw-r--r-- 2 hadoop supergroup 53659758 2021-03-19 23:24 /user/Hive/warehouse/textfile_table/000000_0.gz
-rw-r--r-- 2 hadoop supergroup 53648309 2021-03-19 23:26 /user/Hive/warehouse/textfile_table/000001_1.gz
總結(jié):相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存儲方式,數(shù)據(jù)加載時性能消耗較大,但是具有較好的壓縮比和查詢響應(yīng)。
數(shù)據(jù)倉庫的特點是一次寫入、多次讀取,因此,整體來看,RCFILE相比其余兩種格式具有較明顯的優(yōu)勢。
2.Hive join過程中大表小表的放置順序?
將最大的表放置在JOIN語句的最右邊,或者直接使用/*+ streamtable(table_name) */指出。在編寫帶有 join 操作的代碼語句時,應(yīng)該將條目少的表/子查詢放在 Join 操作符的左邊。因為在 Reduce 階段,位于 Join 操作符左邊的表的內(nèi)容會被加載進內(nèi)存,載入條目較少的表可以有效減少 OOM(out of memory)即內(nèi)存溢出。所以對于同一個 key 來說,對應(yīng)的 value 值小的放前,大的放后,這便是“小表放前”原則。若一條語句中有多個 Join,依據(jù) Join 的條件相同與否,有不同的處理方法。
3.Hive的兩張表關(guān)聯(lián),使用MapReduce怎么實現(xiàn)?
如果其中有一張表為小表,直接使用map端join的方式(map端加載小表)進行聚合。
如果兩張都是大表,那么采用聯(lián)合key,聯(lián)合key的第一個組成部分是join on中的公共字段,第二部分是一個flag,0代表表A,1代表表B,由此讓Reduce區(qū)分客戶信息和訂單信息;在Mapper中同時處理兩張表的信息,將join on公共字段相同的數(shù)據(jù)劃分到同一個分區(qū)中,進而傳遞到一個Reduce中,然后在Reduce中實現(xiàn)聚合。