大數據hive面試題

1)Hive數據傾斜問題:
傾斜緣由: map輸出數據按Key Hash分配到reduce中,因爲key分佈不均勻、或者業務數據自己的特色。】【等緣由形成的reduce上的數據量差別過大。
1.1)key分佈不均勻
1.2)業務數據自己的特性
1.3)SQL語句形成數據傾斜
解決方案:
1>參數調節:
    hive.map.aggr=true
    hive.groupby.skewindata=true
有數據傾斜的時候進行負載均衡,當選項設定爲true,生成的查詢計劃會有兩個MR Job。第一個MR Job中,Map的輸出結果集合會隨機分佈到Reduce中,每一個Reduce作部分聚合操做,並輸出結果,這樣處理的結果是相同Group By Key有可能被分發到不一樣的Reduce中,從而達到負載均衡的目的;第二個MR Job在根據預處理的數據結果按照 Group By Key 分佈到Reduce中(這個過程能夠保證相同的 Group By Key 被分佈到同一個Reduce中),最後完成最終的聚合操做。
2>SQL語句調節:
   1)選用join key 分佈最均勻的表做爲驅動表。作好列裁剪和filter操做,以達到兩表join的時候,數據量相對變小的效果。
   2)大小表Join: 使用map join讓小的維度表(1000條如下的記錄條數)先進內存。在Map端完成Reduce。
   3)大表Join大表: 把空值的Key變成一個字符串加上一個隨機數,把傾斜的數據分到不一樣的reduce上,因爲null值關聯不上,處理後並不影響最終的結果
   4)count distinct大量相同特殊值:count distinct時,將值爲空的狀況單獨處理,若是是計算count distinct,能夠不用處理,直接過濾,在作後結果中加1。若是還有其餘計算,須要進行group by,能夠先將值爲空的記錄單獨處理,再和其餘計算結果進行union.

2)請說明hive中 sort by ,order by ,cluster by ,distribute by各表明什麼意思。
order by :會對輸入作全局排序,所以只有一個reducer(多個reducer沒法保證全局有序).只有一個reducer,會致使當輸入規模較大時,須要較長的計算時間。
sort by :不是全局排序,其在數據進入reducer前完成排序
distribute by :按照指定的字段對數據進行劃分輸出到不一樣的reduce中
cluster by :除了具備distribute by 的功能外還兼具sort by 的功能

3)描述數據中的null,在hive底層如何存儲
null在hive底層默認是用"\N"來存儲的,因此在sqoop到mysql以前須要將爲null的數據加工成其餘字符,不然sqoop提示錯誤

4)Hive中 split、coalesce以及collect_list函數的用法
   split將字符串轉化爲數組
    coalesce(T v1,T v2,...) 返回參數中的第一個非空值;若是全部值都爲null,那麼返回null
    collect_list列出該字段全部的值,不去重 select collect_list(id) from table;

5)將文件導入到hive表中
   load data local inpath '/a.txt' overwrite into table test partition(xx='xx')
   
6)Hive文件壓縮格式有哪些,壓縮效率如何
開啓壓縮
set hive.exec.compress.output=true;
set mapred.output.compress=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set io.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set mapred.output.compression.type=BLOCK;
TextFile (壓縮方式Gzip,Bzip2壓縮後不支持split)
SequenceFile
RCFile(存儲方式:數據按行分塊,每塊按列存儲。結合了行存儲和列存儲的優勢)
ORCFile 

7)Hive的分組方式
row_number() 是沒有重複值的排序(即便兩天記錄相等也是不重複的),能夠利用它來實現分頁
dense_rank() 是連續排序,兩個第二名仍然跟着第三名
rank()       是跳躍排序的,兩個第二名下來就是第四名