大數據面試總結(一)

2020-08-14 01:04:39

1. 列式儲存和行式儲存的區別,各自的優點是什麼?

答:傳統的行儲存在沒有列索引的情況下,會把一行全部查出來,查詢會使用大量IO,適合針對行操作。列式儲存: 每一列單獨存放,數據即是索引。

 

2. RDD是什麼?再說說RDD dataframe dataset的區別

答:官方介紹,是彈性分佈式數據集。 RDD是隻讀的、分割區記錄的集合。概念不是很重要,但是要理解RDD的三個特性,即分割區,不可變,並行操作。

RDD是分佈式的Java物件的集合。DataFrame是分佈式的Row物件的集合。DataFrame比RDD多了schema,能看到數據的結構資訊。DataFrame除了提供了比RDD更豐富的運算元以外,更重要的特點是提升執行效率、減少數據讀取以及執行計劃的優化,比如filter下推、裁剪等。Dataset可以認爲是DataFrame的一個特例,主要區別是Dataset每一個record儲存的是一個強型別值而不是一個Row,因此DataSet可以在編譯時檢查型別,並且是物件導向的程式設計介面。DataSet的效能比RDD的要好很多。

【參考資料:https://www.jianshu.com/p/c0181667daa0

 

3. 談談你對parquet的瞭解

答:Apache Parquet是Hadoop生態圈中一種新型列式儲存格式,它可以相容Hadoop生態圈中大多數計算框架(Hadoop、Spark等),被多種查詢引擎支援(Hive、Impala、Drill等),並且它是語言和平臺無關的。

格式 儲存方式 壓縮方式 具體特點
TEXTFILE 按行儲存 Gzip,Bzip2  儲存空間消耗比較大,並且壓縮的text 無法分割和合併 查詢的效率最低,可以直接儲存,載入數據的速度最高
SEQUENCEFILE 按行儲存 NONE,RECORD,BLOCK。Record壓縮率低,一般建議使用BLOCK壓縮 儲存空間消耗最大,壓縮的檔案可以分割和合併 查詢效率高,需要通過text檔案轉化來載入
RCFILE 按列儲存  

儲存空間最小,

查詢的效率最高 ,

需要通過text檔案轉化來載入,

載入的速度最低。

壓縮快 快速列存取。

讀記錄儘量涉及到的block最少 

讀取需要的列只需要讀取每個row group 的頭部定義。 

讀取全量數據的操作 效能可能比sequencefile沒有明顯的優勢

ORC 按列儲存 zlib(default),snappy 壓縮快,快速列存取 ,效率比rcfile高,是rcfile的改良版本
PARQUET 按列儲存   相對於PRC,Parquet壓縮比較低,查詢效率較低,不支援update、insert和ACID.但是Parquet支援Impala查詢引擎
AVRO 按行儲存    

【參考資料:https://www.cnblogs.com/xdlaoliu/p/9978448.html

 

4. 寫過UDF嗎?談談UDAF和UDTF區別

答:udf:一進一出,udaf:多進一出,聚合函數(min/max/count/),udtf:一進多出,later view explore。

 

5. Hive的元數據儲存在哪裏

答:元數據(Meta Date),主要記錄數據倉庫中模型的定義、各層級間的對映關係、監控數據倉庫的數據狀態及 ETL 的任務執行狀態。一般會通過元數據資料庫(Metadata Repository)來統一地儲存和管理元數據,其主要目的是使數據倉庫的設計、部署、操作和管理能達成協同和一致。根據元數據儲存的媒介不同,分爲下面 下麪兩個版本,其中 derby 屬於內嵌模式,無需設定直接可用。實際生產環境中則使用 mysql 來進行元數據的儲存。

【參考資料:https://blog.csdn.net/b_oyidyt/article/details/81952479

 

6. Kylin預計算的數據存在哪裏?

答:Kylin目前的數據都儲存在HBase當中,因此掃描的過程都在HBase中進行。對於每個region,kylin都會啓動一個執行緒來向HBase發送掃描請求,然後將所有掃描的結果返回,聚合之後再返回上一層。爲了加快掃描效率,Kylin還使用了HBase的coprocessor來對每個region的掃描結果進行預聚合。

【參考資料:https://www.cnblogs.com/163yun/p/9722586.html

 

7. Hive去重的方式

答:1.distinct,2.group by,3.row_number()

舉例:row_number() over(PARTITION BY tel ORDER BY tel DESC) = 1

 

8. 行轉列,列轉行的方法

答:行轉列,將一個融合多個資訊的欄位拆分爲多行。實現方法:利用內建UDTF函數explode實現。

aaa,bbb,ccc  ===>  aaa
                                bbb
                                ccc

列轉行,將多行數據融合爲一行。實現方法:concat_ws和collect_set等的結合使用。

aaa   ===>   aaa,bbb,ccc
bbb
ccc

【參考:https://blog.csdn.net/zuiziyoudexiao/article/details/106967856

 

9:一個欄位型別爲int,裏面有null值,sum之後的結果是什麼

答:Hive對有null值的欄位爲int型別的列求和,會過濾null值進行求和。

select avg(col1) avg_num, sum(col1) sum_num, count(1) cnt, count(col1) cnt_col1
from
(
    select null as col1
    union all
    select 1 as col1
    union all
    select 2 as col1
) a
>>> 1.5    3    3    2

【參考:https://www.cnblogs.com/damahuhu/p/12009182.html】 

 

10. Lead和lag哪個是向上偏移

答:LEAD(col,n,DEFAULT) 用於統計視窗內往下第n行值。第一個參數爲列名,第二個參數爲往下第n行(可選,預設爲1),第三個參數爲預設值(當往下第n行爲NULL時候,取預設值,如不指定,則爲NULL)

LAG(col,n,DEFAULT) 用於統計視窗內往上第n行值。

【參考:https://www.cnblogs.com/qingyunzong/p/8798606.html

 

11. Hive對json串的處理

答:常用get_json_object進行處理,在非規範的json格式的時候,也常用正則來提取需要的數據。

 

12. Hive表的分割區數過多有什麼影響?

答:1.當分割區過多且數據很大時,可以使用嚴格模式,避免出發一個大的mapreduce任務。當分割區數量過多且數據量較大時,執行寬範圍的數據掃描會觸發一個很大的mapreduce任務。在嚴格模式下,當where中沒有分割區過濾條件時會禁止執行。

2.hive如果有過多的分割區,由於底層是儲存在HDFS上,HDFS上只用於儲存大檔案 而非小檔案,因爲過多的分割區會增加namenode的負擔。

3.hive會轉化爲mapreduce,mapreduce會轉化爲多個task。過多小檔案的話,每個檔案一個task,每個task一個JVM範例,JVM的開啓與銷燬會降低系統效率。

【參考:http://www.atguigu.com/jsfx/12340.html

 

13. Hive內部表和外部表有什麼區別?

答:未被external修飾的是內部表(managed table),被external修飾的爲外部表(external table);
區別:
內部表數據由Hive自身管理,外部表數據由HDFS管理;
內部表數據儲存的位置是hive.metastore.warehouse.dir(預設:/user/hive/warehouse),外部表數據的儲存位置由自己制定;
刪除內部表會直接刪除元數據(metadata)及儲存數據;刪除外部表僅僅會刪除元數據,HDFS上的檔案並不會被刪除;
對內部表的修改會將修改直接同步給元數據,而對外部表的表結構和分割區進行修改,則需要修復(MSCK REPAIR TABLE table_name;)

【參考:https://blog.csdn.net/qq_44449767/article/details/99716613

 

14. 誤刪Hive表了要怎麼辦

答:如果是內部表,刪除表的時候底層實際做的是將儲存表的數據檔案移動到.Trash/Current目錄下,將表的元數據資訊刪除了。通過【sh hadoop fs -lsr 檔案目錄】找到檔案所在位置,把它mv到指定的位置。然後重新建一張和刪除的表結構一模一樣的表。如果不是分割區表現在就可以通過sql檢視數據了,如果是分割區表的話還需要進行修復分割區的操作:MSCK REPAIR TABLE table_name; 如果是外部表,則建立以前的表結構,並且用命令MSCK REPAIR TABLE table_name恢復數據。

【參考:https://blog.csdn.net/weixin_42821133/article/details/106203189

 

15. Sort by 和order by的區別

答:order by 是全域性排序,預設爲升序asc ,因此只有一個reducer,只有一個reduce task的結果。如果指定了hive.mapred.mode=strict(預設值是nonstrict),這時就必須指定limit來限制輸出條數。

sort by 是區域性排序,其在數據進入reducer前完成排序。因此,如果用sort by 進行排序,並且設定mapred.reduce.tasks>1,
則sort by 只保證每個reducer的輸出有序,不保證全域性排序。但是當reducetask的個數爲1的話和order by 的排序結果一致。

distribute by 是根據指定的欄位將數據分到不同的reducer,且分發演算法是hash雜湊。類似於分桶的概念 按照指定的distribute by 欄位和 設定的reducetask的個數進行取餘分組,但是並沒有排序,只是分,沒有排序。

cluster by 除了具有distribute by 的功能外,還會對該欄位進行排序。cluster by = distribute by+sort by

【參考:https://www.cnblogs.com/dcx-1993/p/11041228.html

 

16. Python是怎麼和Linux系統互動的

答:利用subprocess模組進行互動。subprocess.Popen,Popen.communicate等方法來實現。

 

17. Hive跑完了,進度條卡在那邊不動了,是什麼原因?

答:(問題有點模糊)yarn日誌裏面,process進度條爲100%,但是mr過程還沒有結束,此時有可能還在傳輸寫數據。

 

18. Hive調優方法

答:

1. <!--開啓任務並行執行—>
   set hive.exec.parallel=true;
   --sql中存在的查詢操作無直接關聯,可以並行執行。如union all操作,可以開啓並行執行。

2. 數據傾斜問題
   主要原因:
  (1)group by 維度過小,某一值的數量過多,導致處理此值的reduce非常耗時。
     在 Map 端進行聚合,預設爲 True:set hive.map.aggr = true
  (2)count(distinct x) 某特殊值過多,處理此特殊值的reduce耗時。
     用group by代替count distinct
  (3)join a.小表關聯大表,其中小表的關聯鍵key比較集中,導致分發到某一個或某幾個reduce的數據遠高於平均值。
     set hive.skewjoin.key=100000; --這個是join的鍵對應的記錄條數超過這個值則會進行分拆,值根據具體數據量設定
     set hive.optimize.skewjoin=true;--如果是join 過程出現傾斜 應該設定爲true

【參考1:https://blog.csdn.net/fengzheku/article/details/85004760

【參考2:https://blog.csdn.net/m0_37773338/article/details/107314066】 

 

19:SparkSQL join的方式?

答:對於Spark來說有3中Join的實現,每種Join對應着不同的應用場景:

Broadcast Hash Join : 適合一張較小的表和一張大表進行join
Shuffle Hash Join :  適合一張小表和一張大表進行join,或者是兩張小表之間的join
Sort Merge Join : 適合兩張較大的表之間進行join

【參考:https://www.cnblogs.com/0xcafedaddy/p/7614299.html

 

20. 談談你對機器學習演算法的一些瞭解

答:svm演算法在輿情分析文字分類中的運用。

【參考:https://blog.csdn.net/zhzhl202/article/details/8197109

 

21. 數據開發的一些流程和規範

答:需求的大致流程:需求方-->產品經理-->數據產品經理-->數據開發。

數倉規範:表命名規範、任務命名規範、程式碼開發規範等。

 

22. dm層表一般儲存什麼數據

答:又稱數據集市層DM(date market),基於DW上的基礎數據,整合彙總成分析某一個主題域的服務數據,一般是寬表,用於提供後續的業務查詢,OLAP分析,數據分發等。

【參考:https://www.cnblogs.com/HondaHsu/p/5314176.html