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分析,數據分發等。