1. 程式人生 > >資料倉庫問題總結

資料倉庫問題總結

1.在關係模型中,實現“關係中不允許出現相同的元組”的約束是通過 “主鍵” 完成的。

2.在MySql中,concat函式的作用是是將傳入的引數連線成為一個字串,則concat(’aaa’,null,’bbb’)的結果是( NULL)

3.關於新增帶自增列的資料:自增的列無須顯式地新增。如需新增全部欄位資料時,僅需表名,可省略全部欄位

4.YARN支援的排程語義:

    請求節點nodeX上5個Container:虛擬CPU個數為2,記憶體量為2GB
    請求機架rackX上3個Container:虛擬CPU個數為4,記憶體量為3GB

5.SQL Server的描述:

          關係型資料庫、企業級資料庫、客戶機/伺服器資料庫

6.在SQL Server中,要防止大於100的數被儲存到int型別的列,可以使用----檢查約束

7.ETL工具:datastage、kettle、tableau

8.OLAP的核心是:多維分析

9.在檔案a.txt中查詢某字串'str'     grep str a.txt

10.資料庫系統中採用封鎖技術的目的是為了保證一致性

11.關於Hive 中的壓縮格式 RCFile、TextFile、SequenceFile

TextFile是Hive預設格式,不作壓縮,磁碟及網路開銷較大。可以結合Gzip, Bzip2使用,但使用這種方式,hive不會對資料進行切分,從而無法對資料進行並行操作
SequenceFile 是Hadoop API提供支援的一種二進位制檔案,具有使用方便,可分割,可壓縮的特點,支援三種壓縮選擇:NONE, RECORD, BLOCK。RECORD壓縮率低,一般建議使用BLOCK壓縮
相比TEXTFILE和SEQUENCEFILE,RCFILE由於列式儲存方式,資料載入時效能消耗較小,且具有較好的壓縮比和查詢響應

12.查詢每個部門中工資最高的員工。兩張表(員工表和部門表)

select d.Name as Department ,e.Name as Employee,e.salary from Emplyee e inner join Department d on e.Department = d.Id where (e.DepartmentId, e.salary) in (select DepartmentId,max(Salary) from Employee group by DepartmentId);

13.客戶隱私管理是銀行業的重中之重,現需要對資料倉庫中多張表中儲存的不同格式的客戶手機號虛擬出一個"手機號ID",該ID會被用於公網中的系統間呼叫,你會如何生成該ID,並請設計手機號和ID的對映關係表結構?請注意:手機號和ID的關係一旦生成,不應再發生改變;無法通過ID倒推出手機號

     (1)先按照將手機號標準化,剔除不符合11長度的手機號,剔除開頭不是1的手機號等等。

     (2)對新增手機號排序後生成一個自增ID,該ID需大於已存在ID的最大值

     (3)對已有手機號保留之前的ID

     (4)表結構參考【ID,手機號,ID生成時間】

14.數倉ETL過程中,資料探索階段主要包括哪些內容?

     (1)收集所有的源系統的文件、資料字典等內容

     (2)收集源系統的使用情況,如誰在用、每天多少人用、佔多少記憶體空間等內容

     (3)判斷出資料的起始來源

     (4)通過資料概況來對源系統的資料關係進行分析。

15.資料倉庫中為什麼要做拉鍊表?什麼樣的場景比較適合用拉鍊表?舉例說明拉鍊表的實現過程?

1)記錄下資料所有的狀態變化的記錄,如資料是按日批次更新,相當於實現了資料每日切片的功能。

2)適合狀態會發生變化的資料,並且每次資料變化量比較小,而歷史狀態又比較重要的資料,資料必須要有主鍵。

3)首先需要給每條資料增加兩個欄位:鏈頭和鏈尾,記錄了這條資料的有效起始時間和結束時間,批量更新時,將歷史資料中刪除和被更新的資料的鏈尾置為當前時間,表示這些資料的鏈路被關閉。將新資料中新增的和更新歷史資料的資料的鏈頭設定為當前時間,鏈尾設定為一個很大的時間,表示這些資料新開闢一條鏈路並且為當前有效。在對比資料的時候根據主鍵對比整條資料是否發生變化,只要有一個欄位的值發生變化即視為該條資料有更新。

16.spark程式碼分析

lines = sc.textFile("data.txt")

                           //從外部檔案中定義了一個基礎的RDD,資料集並未載入或者執行,lines僅僅是一個指向檔案外部檔案的指標
lineLengths = lines.map(lambda s: len(s))

        //lineLengths定義了一個map轉換結果的RDD,資料集並未載入或者執行,同樣的,lineLengths並未執行,僅僅是一個指標
lineLengths.persist()         //
lineCount = lineLengths.count()

             //count()為一個action操作,資料開始載入執行,會將所有的RDD載入乳記憶體進行計算,並返回結果
totalLength = lineLengths.reduce(lambda a, b: a + b)


2) 該步指定lineLengths在第一次計算後會被加入到記憶體中
在第四行,lineLengths被首次計算,加入記憶體
在第五行,lineLengths再次被使用到,直接採用記憶體中的lineLengths進行計算,而不需要再次計算lineLengths的值

17.事實表和維度表的概念以及怎麼設計? 

事實表:

每個資料倉庫都包含一個或者多個事實資料表。事實資料表可能包含業務銷售資料,如現金登記事務所產生的資料,事實資料表通常包含大量的行一般事實表中只存放數字或者一些Flag用來統計(Count),如收益、數量、支出等 

維度表(Dimension Table):

維度表可以看作是使用者來分析資料的視窗,維度表中包含事實資料表中事實記錄的特性,有些特性提供描述性資訊,有些特性指定如何彙總事實資料表資料,以便為分析者提供有用的資訊,維度表包含幫助彙總資料的特性的層次結構。

事實表的設計是以能夠正確記錄歷史資訊為準則,維度表的設計是以能夠以合適的角度來聚合主題內容為準則。


18.hive表關聯查詢,什麼情況下會發生資料傾斜,應該如何解決?

傾斜原因:

map輸出資料按key Hash的分配到reduce中,由於key分佈不均勻、業務資料本身的特性、建表時考慮不周等原因造成的reduce 上的資料量差異過大。

解決方案:

(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。