大數據開發面試的總結-第一篇

大數據開發面試

前言

基於面大數據開發的遇到的一些問題,以及圍繞這些問題展開的一些知識點的準備,對大數據開發崗的面試做了一個梳理。努力做一個知識開源的互聯網民工,現在階段還是一個被別人挑選的人,向前進吧。

sql/hql/spark sql/數據倉庫 方向

1. spark sql 數據優化中,需要注意哪些方面?

1.使用臨時視圖減少落到磁盤, 不落到磁盤盤是spark的一個優勢,中間步驟 全部用 temporary view 代替臨時table ,減少讀寫hdfs的操作
2.spark下建表 文件格式選擇,spark默認爲textfile,可根據需求使用squenceFile or ORCFile
3.select 指定字段,代替select *
4.spark其他技術,如broadcast, bucket
5.另外spark sql優化還可通過查看sparkUI找到哪一步耗時最長,針對性優化

2. SparkSql 支持讀入的數據類型有哪些?SparkSql 的數據保存語法是什麼樣的?

SparkSql 支持讀入的數據類型有 parquet、csv、json、jdbc、table 和 text 等。 例如選取 DataFrame 中的兩列保存到 json 文件中,可指定保存文件的格式 df.select(“name”, “favorite_color”).write.format(“json”).save(“namesAndFavColors.json”)

3. 談談 Hive 裏分區的概念,它的作用是什麼,如何添加和刪除分區?

在 Hive 中,表中的一個分區(Partition)對應於表下的一個目錄,分區的作用就是輔助查詢,縮小查詢範圍,在 HiveSql 中限制分區條件可加快數據的檢索速度。 // 添加分區 ALTER TABLE day_table ADD PARTITION (dt=‘2008-08-08’, hour=‘08’) location ‘/path/pv1.txt’;

4. 如何自定義一個函數供 HiveSql 使用,具體步驟分爲哪幾步?

Hive使用python編寫的自定義函數UDF進行ETL的步驟:
在hive裏面加載py文件
add file /usr/local/src/test.py
在HQL中使用TRANSFORM函數動態執行Python文件:
select TRANSFORM(sex) USING ‘python test.py’ as sex from test;

5. HiveSql 使用到的數據跟傳統 SQL 數據庫中的數據存儲方式不同,你能講解下 HiveSql 中使用到的數據源的數據組織方式嗎?
(1) Hive 的數據組織包括數據庫、表、視圖、分區、分桶和表數據等。數據庫,表,分區等等都對應 HDFS 上的一個目錄。分桶和表數據對應 HDFS 對應目錄下的文件。
(2) Hive 中所有的數據都存儲在 HDFS 中,沒有專門的數據存儲格式,因爲 Hive 是讀模式 (Schema On Read),可支持 TextFile,SequenceFile,RCFile 或者自定義格式等。
(3)只需要在創建表的時候告訴 Hive 數據中的列分隔符和行分隔符,Hive 就可以解析數據。

6. Uninon 跟uninon all 的區別
sql中union和union all區別是,union去重,union all不去重;spark sql中union不去重;

7. 除了distinct外如何使用SQL對數據去重
還可以用group by去重;

8.簡述下項目中etl過程
ETL是將業務系統的數據經過抽取、清洗轉換之後加載到數據倉庫的過程,目的是將企業中的分散、零亂、標準不統一的數據整合到一起,爲企業的決策提供分析依據。
(1)數據的抽取(Extract)
  這一部分需要在調研階段做大量的工作,首先要搞清楚數據是從幾個業務系統中來,各個業務系統的數據庫服務器運行什麼DBMS,是否存在手工數據,手工數據量有多大,是否存在非結構化的數據等等,當收集完這些信息之後纔可以進行數據抽取的設計。
  1、對於與存放DW的數據庫系統相同的數據源處理方法
  這一類數據源在設計上比較容易。一般情況下,DBMS(SQLServer、Oracle)都會提供數據庫鏈接功能,在DW數據庫服務器和原業務系統之間建立直接的鏈接關係就可以寫Select 語句直接訪問。
  2、對於與DW數據庫系統不同的數據源的處理方法
  對於這一類數據源,一般情況下也可以通過ODBC的方式建立數據庫鏈接——如SQL Server和Oracle之間。如果不能建立數據庫鏈接,可以有兩種方式完成,一種是通過工具將源數據導出成.txt或者是.xls文件,然後再將這些源系統文件導入到ODS中。另外一種方法是通過程序接口來完成。
  3、對於文件類型數據源(.txt,.xls),可以培訓業務人員利用數據庫工具將這些數據導入到指定的數據庫,然後從指定的數據庫中抽取。或者還可以藉助工具實現。
  4、增量更新的問題
  對於數據量大的系統,必須考慮增量抽取。一般情況下,業務系統會記錄業務發生的時間,我們可以用來做增量的標誌,每次抽取之前首先判斷ODS中記錄最大的時間,然後根據這個時間去業務系統取大於這個時間所有的記錄。利用業務系統的時間戳,一般情況下,業務系統沒有或者部分有時間戳。
(2)數據清洗
  數據清洗的任務是過濾那些不符合要求的數據,將過濾的結果交給業務主管部門,確認是否過濾掉還是由業務單位修正之後再進行抽取。
不符合要求的數據主要是有不完整的數據、錯誤的數據、重複的數據三大類。
  (1)不完整的數據:這一類數據主要是一些應該有的信息缺失,如供應商的名稱、分公司的名稱、客戶的區域信息缺失、業務系統中主表與明細表不能匹配等。對於這一類數據過濾出來,按缺失的內容分別寫入不同Excel文件向客戶提交,要求在規定的時間內補全。補全後才寫入數據倉庫。
  (2)錯誤的數據:這一類錯誤產生的原因是業務系統不夠健全,在接收輸入後沒有進行判斷直接寫入後臺數據庫造成的,比如數值數據輸成全角數字字符、字符串數據後面有一個回車操作、日期格式不正確、日期越界等。這一類數據也要分類,對於類似於全角字符、數據前後有不可見字符的問題,只能通過寫SQL語句的方式找出來,然後要求客戶在業務系統修正之後抽取。日期格式不正確的或者是日期越界的這一類錯誤會導致ETL運行失敗,這一類錯誤需要去業務系統數據庫用SQL的方式挑出來,交給業務主管部門要求限期修正,修正之後再抽取。
  (3)重複的數據:對於這一類數據——特別是維表中會出現這種情況——將重複數據記錄的所有字段導出來,讓客戶確認並整理。
  數據清洗是一個反覆的過程,不可能在幾天內完成,只有不斷的發現問題,解決問題。對於是否過濾,是否修正一般要求客戶確認,對於過濾掉的數據,寫入Excel文件或者將過濾數據寫入數據表,在ETL開發的初期可以每天向業務單位發送過濾數據的郵件,促使他們儘快地修正錯誤,同時也可以做爲將來驗證數據的依據。數據清洗需要注意的是不要將有用的數據過濾掉,對於每個過濾規則認真進行驗證,並要用戶確認。
(3)數據轉換
  數據轉換的任務主要進行不一致的數據轉換、數據粒度的轉換,以及一些商務規則的計算。
  (1)不一致數據轉換:這個過程是一個整合的過程,將不同業務系統的相同類型的數據統一,比如同一個供應商在結算系統的編碼是XX0001,而在CRM中編碼是YY0001,這樣在抽取過來之後統一轉換成一個編碼。
  (2)數據粒度的轉換:業務系統一般存儲非常明細的數據,而數據倉庫中數據是用來分析的,不需要非常明細的數據。一般情況下,會將業務系統數據按照數據倉庫粒度進行聚合。
  (3)商務規則的計算:不同的企業有不同的業務規則、不同的數據指標,這些指標有的時候不是簡單的加加減減就能完成,這個時候需要在ETL中將這些數據指標計算好了之後存儲在數據倉庫中,以供分析使用。
9. Spark的運行流程
(1)構建Spark Application的運行環境(啓動SparkContext),SparkContext向資源管理器(可以是Standalone、Mesos或YARN)註冊並申請運行Executor資源;
(2)資源管理器分配Executor資源並啓動StandaloneExecutorBackend,Executor運行情況將隨着心跳發送到資源管理器上;
(3)SparkContext構建成DAG圖,將DAG圖分解成Stage,並把Taskset發送給Task Scheduler。Executor向SparkContext申請Task
(4)Task Scheduler將Task發放給Executor運行同時SparkContext將應用程序代碼發放給Executor。
(5)Task在Executor上運行,運行完畢釋放所有資源。

10 . Sql開窗函數,開窗函數中row_number與rank的區別
row_number是不管重複,都按遞增計數;
rank是重複相同的數,序數也爲一樣;

11.Avg、sum、count 函數,在某列有空值的情況下,結果會有哪些不同
avg空值會忽略,sum空值會忽略;count(*)不會忽略空值,count(col)會忽略只爲空的列;count(1)會忽略空值;

12.一個表兩個字段,一個id,一個values;values有連續相同;但是有缺失,找出缺失的地方補全(連續缺失的字段如何補全)
暫無答案。

13.數據倉庫的基本原理
數據倉庫系統是由數據源、集成工具、數據倉庫與數據倉庫服務器、OLAP服務器、元數據與元數據管理工具、數據集市和前臺分析工具等組成。
(1)數據源:
數據源就是提供初始數據的地方,是數據倉庫系統的基礎。通常包括企業內部數據和外部數據。內部數據包括各種操作型數據庫中的數據以及文檔數據,外部數據包括各類法律法規、市場信息、競爭對手信息以及各種統計數據和文檔。
(2)集成工具:
即ETL工具。ETL是的縮寫,包括數據抽取()、數據清洗()、數據轉換()、數據加載()等工作。具體地說:
補充:ETL工作是BI/DW項目的核心和靈魂,它按照統一的規則集成並提高數據的價值,是負責完成數據從數據源向目標數據倉庫轉化的過程,是實施數據倉庫的重要步驟。如果說數據倉庫的模型設計是一座大廈的設計藍圖,數據是磚瓦的話,那麼ETL就是建設大廈的過程。在整個項目中最難部分是用戶需求分析和模型設計,而ETL規則設計和實施則是工作量最大的,約佔整個項目的60%~80%,這是國內外從衆多實踐中得到的普遍共識。
(3)數據倉庫服務器:
數據倉庫服務器負責管理數據倉庫中的數據,爲整個企業的數據分析提供一個完整的、統一的視圖。
(4)OLAP服務器:
使用OLAP服務器對分析需要的數據按照多維數據模型進行再次重組,以支持用戶多角度、多層級的數據分析。
(5)數據集市:
數據集市是一個小型的數據倉庫,通常具有較少的主題域,是部門級的數據倉庫,面向部門級的應用。
(6)前臺分析工具:
包括各種數據分析工具,如報表工具、OLAP分析工具、數據挖掘工具。各種分析工具既可以從數據倉庫中獲取數據,還可以從數據集市中獲取數據。
(7)元數據:
元數據就是整個數據倉庫的所有描述性信息,即關於數據的數據。ETL負責建立元數據。
總結:數據從數據源到將最終的分析結果呈現給用戶,需要經歷以下幾個過程: ① 從各種數據源中抽取合適的、需要的數據; ② 對數據進行清洗、加工、轉換、重構等預處理工作; ③ 建立高效、海量的企業數據倉庫(); ④ 針對特定的分析主題,建立專門的數據集市(); ⑤ 針對特定的業務需要,創建前端數據展現應用,或者開展專題分析項目。

數據集市
(1)數據集市的定義:
數據集市就是面向部門或者應用的小型數據倉庫,相比企業級數據倉庫,具有較少的主題域。
(2)數據集市的分類:
按照數據的獲取方式,將數據集市分爲從屬型數據集市和獨立型數據集市。
從屬型數據集市就是從中央數據倉庫中獲取數據,這類數據集市之間是互連的。
獨立型數據集市就是直接從操作型數據庫等數據源中獲取數據,這類數據集市之間沒有聯繫,是相互獨立的。
(3)兩種建立數據集市的思想:
兩種數據集市對應着兩種建立數據集市的思想,即“自頂向下”和“自底向上”的思想。
“自頂向下”就是先創建一箇中央數據倉庫,然後按照各個特定部門的特定需求建立多個從屬型的數據集市。
“自底向上”就是先以最少的投資,根據部門的實際需要,創建多個獨立的數據集市,然後不斷擴充、不斷完善,最終形成一箇中央數據倉庫。
(4)數據集市的作用:
數據集市一般包含着某一特定業務內容的數據,因此可以按照業務的分類來組織,當然也可以按照數據倉庫的主題、地理位置、企業部門來組織。這樣,數據集市就可以滿足企業、部門、個人不同層次、不同範圍的人員對數據的需求。
數據集市可以分佈在不同的物理平臺上,也可以邏輯分佈在同一物理平臺上。
(5)數據集市與數據倉庫的區別:
數據集市是按照部門或者業務分類進行組織的小型數據倉庫,而數據倉庫則是面向整個企業的。二者的不同,一是主題域的不同,二是數據規模的不同,三是訪問效率的不同。

元數據
(1)元數據的定義:
元數據就是關於數據的數據。關係型數據庫中的就是元數據的一種。
(2)元數據的作用:
元數據描述數據的結構、來源、抽取和轉換規則、存儲,描述操縱數據的進程和應用程序的結構、功能等。其主要目的就是提供數據資源的全面指南,使數據倉庫管理員和開發人員能夠清楚的瞭解到數據存放在哪裏、有什麼數據、來源於哪裏、如何使用和管理這些數據。
(3)元數據的分類:
按照使用元數據的用戶分類,可以分爲技術元數據和業務元數據。技術元數據描述數據的技術細節,主要提供給開發人員和管理人員;業務元數據主要是讓業務人員能夠明白數據倉庫中的數據。
按照來源的正式程度分類,分爲正式元數據和非正式元數據,前者是經過討論並由決策者確定的元數據,後者是一些規範、制度、常識組成,沒有標準的形式。
按照功能分類,分爲數據源元數據、ETL元數據、ODS元數據、DW元數據、報表元數據、接口數據文件格式元數據、商業元數據。

14.星型模型和雪花模型的比較
星型模型因爲數據的冗餘所以很多統計查詢不需要做外部的連接,因此一般情況下效率比雪花型模型要高。
雪花模型使得維度分析更加容易(如果要得到用戶的某一指標,還需要做表與表之間的join),比如“針對特定的廣告主,有哪些客戶或者公司是在線的?”
星形模型用來做指標分析更適合(不需要join,直接就是一張大寬表),比如“給定的一個客戶他們的收入是多少?”
雪花模型更少冗餘;

15.數據優化中除了用過mapjoin之外,還用過哪些join
第一:在map端產生join
mapJoin的主要意思就是,當鏈接的兩個表是一個比較小的表和一個特別大的表的時候,我們把比較小的table直接放到內存中去,然後再對比較大的表格進行map操作。join就發生在map操作的時候,每當掃描一個大的table中的數據,就要去去查看小表的數據,哪條與之相符,繼而進行連接。這裏的join並不會涉及reduce操作。map端join的優勢就是在於沒有shuffle,真好。在實際的應用中,我們這樣設置:
set hive.auto.convert.join=true;
這樣設置,hive就會自動的識別比較小的表,繼而用mapJoin來實現兩個表的聯合。
第二:common join
common join也叫做shuffle join,reduce join操作。這種情況下生再兩個table的大小相當,但是又不是很大的情況下使用的。具體流程就是在map端進行數據的切分,一個block對應一個map操作,然後進行shuffle操作,把對應的block shuffle到reduce端去,再逐個進行聯合,這裏優勢會涉及到數據的傾斜
第三:SMBJoin(首先排序)
smb是sort merge bucket操作,首先進行排序,繼而合併,然後放到所對應的bucket中去,bucket是hive中和分區表類似的技術,就是按照key進行hash,相同的hash值都放到相同的buck中去。在進行兩個表聯合的時候。我們首先進行分桶,在join會大幅度的對性能進行優化。也就是說,在進行聯合的時候,是table1中的一小部分和table1中的一小部分進行聯合,table聯合都是等值連接,相同的key都放到了同一個bucket中去了,那麼在聯合的時候就會大幅度的減小無關項的掃描。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章