1. 程式人生 > >美團優選大資料開發崗面試真題-附答案詳細解析

美團優選大資料開發崗面試真題-附答案詳細解析

> 公眾號(五分鐘學大資料)已推出大資料面試系列文章—**五分鐘小面試**,此係列文章將會**深入研究各大廠筆面試真題**,並根據筆面試題**擴充套件相關的知識點**,助力大家都能夠成功入職大廠! ![](https://cdn.jsdelivr.net/gh/sunmyuan/cdn/xiaomianshi.jpg) > 此面試題來自牛客網友分享的**美團優選一面**,面試時長**一小時**。網友情況:海外**水本**,在某三線中廠**工作2年**。 > 參考答案由本公眾號提供。如有錯誤,歡迎指正! 以下為面試過程中提問,崗位為大資料開發,根據提問內容看出,主要偏數倉方向 1. 自我介紹 2. 到北京工作的意願 3. SQL題,給一張城市和交易額表,一張城市對應省份表, 取出 省份 總 交易額大於 500 的 省份 的名字 4. SQL題,基於剛才, 得出 省份 總 交易額 [0,500 ] , [500,1000 ] , [1000,+∞ ] 在以下三個區間的 省份 的 數量 5. SQL題,還是基於剛才, 按從小到大的順序得出每個城市的累計交易額,可以用視窗 6. 根據分隔符劃分欄位,可以用正則表達 7. 主要負責的產品 8. 產品的指標如何知道帶來多少價值 9. 指標如何做到精準 10. 就專案中提到的某個實體,講一下他對應的屬性有哪些 11. 如果你建模的話,你會如何建模 12. 主要都抽取哪些資料來源,使用什麼工具 13. 描述一下抽取的內部邏輯,怎麼實現的 14. 除了工作,有去讀什麼書學習嗎 15. 你覺得flink和spark streaming有什麼區別 16. spark streaming相比flink有什麼優點 17. 有什麼想問的嗎 ## 答案詳細解析 #### 1. 自我介紹 面試的時候,面試官說的第一句話就是:“介紹一下你自己吧。” 很多人真的很實誠的就只說一句:“我叫xx,來自xx,今年xx歲。”然後雙方冷場。 這樣的自我介紹還不如前段時間流行的一句話:“我叫xx,我喜歡唱跳、rap、籃球。”起碼你還讓面試官知道了你的特長。 所以這裡就需要你用最短的時間讓面試官記住你,突出自己的優勢、有論證力的說服對方。 原則如下:**不要大段背誦簡歷內容;不要說流水賬,內容冗長;自我介紹時間儘量控制在一分鐘左右**。 那麼怎麼在最短時間內滿足以上三條。 羅振宇說過:“**笨拙的人講道理,而聰明的人會說故事**。” 所以面試時我們要擺脫常規回答,學會“講故事”。那故事怎麼講,記住以下八個字,將自己的經歷或想法套進去: - **目標**:就是我想要做什麼,我想要成為什麼樣的人; - **阻礙**:做這件事的難點是什麼,有哪些“質疑”點; - **努力**:為了克服難點和“質疑”,我做了哪些事情; - **結果**:通過我的努力,我現在獲得了什麼樣的成就。 > 有時間了針對 自我介紹 我再詳細的講解下,這部分還是很重要的,因為這部分就是“推銷”自己,給自己打廣告的時間。 #### 2. 到北京工作的意願 招人肯定是希望找到一個踏實,穩定的人,而不是那種來了幾天或一段時間就走的人。面試官問你這個問題,一是在看你大概能在公司呆多久,二是看公司是否有必要培養你或者錄用你。 所以回答時一定要表達出你一定能來北京並且能長時間待下去(即使你不是這樣),具體回答發揮個人想象。 #### 3. SQL題,給一張城市和交易額表,一張城市對應省份表, 取出 省份 總 交易額大於 500 的 省份 的名字 為了便於理解,根據上面的問題,我們先構造這兩張表: 城市交易額表 `business_table` city_num:城市編號 gmv:交易額 | city_num | gmv | | :--: | :--:| | 1001 | 210 | | 1001 | 90 | | 1002 | 250 | | 1003 | 200 | | 1004 | 700 | | 1005 | 350 | | 1005 | 150 | | 1006 | 250 | | 1007 | 150 | 城市對應省份表:`province_table` province_num:省份編號 province_name:省份名稱 city_num:城市編號 | province_num | province_name | city_num | | :---: | :--: | :--: | | 11 | a | 1001 | | 11 | a | 1005 | | 12 | b | 1002 | | 12 | b | 1003 | | 13 | c | 1004 | | 13 | c | 1006 | | 13 | c | 1007 | 根據以上表,sql 語句如下(以下僅為其中一種寫法,僅供參考) ```sql SELECT MAX(tmp.province_name) FROM ( SELECT bt.city_num, bt.gmv, pt.province_num, pt.province_name FROM business_table bt LEFT JOIN province_table pt ON bt.city_num = pt.city_num ) tmp GROUP BY tmp.province_num HAVING SUM(tmp.gmv) > 500; ``` #### 4. SQL題,基於剛才, 得出 省份 總 交易額 [0,500 ] , [500,1000 ] , [1000,+oo ] 在以下三個區間的 省份 的 數量 參考 sql 語句如下: ```sql SELECT COUNT(CASE WHEN tmp2.pro_gmv >= 0 AND tmp2.pro_gmv < 500 THEN tmp2.pro_name ELSE NULL END) AS gmv_0_500, COUNT(CASE WHEN tmp2.pro_gmv >= 500 AND tmp2.pro_gmv < 1000 THEN tmp2.pro_name ELSE NULL END) AS gmv_500_1000, COUNT(CASE WHEN tmp2.pro_gmv >= 1000 THEN tmp2.pro_name ELSE NULL END) AS gmv_1000_ FROM ( SELECT MAX(tmp.province_name) AS pro_name, SUM(tmp.gmv) AS pro_gmv FROM ( SELECT bt.city_num, bt.gmv, pt.province_num, pt.province_name FROM business_table bt LEFT JOIN province_table pt ON bt.city_num = pt.city_num ) tmp GROUP BY tmp.province_num ) tmp2; ``` #### 5. SQL題,還是基於剛才, 按從小到大的順序得出每個城市的累計交易額,可以用視窗 參考 sql 語句如下: ```sql # 既然面試官讓用視窗函式,那咱們就別客氣了 SELECT city_num, gmv FROM ( SELECT DISTINCT city_num, SUM(gmv) OVER(PARTITION BY city_num) AS gmv FROM business_table ) tmp ORDER BY gmv; ``` #### 6. 根據分隔符劃分欄位,可以用正則表達 ```sql # java String address="上海|上海市|閔行區|吳中路"; String[] splitAddress=address.split("\\|"); //如果以豎線為分隔符,則split的時候需要加上兩個斜槓 \\ 進行轉義 #sql hive> select split('abcdef', 'c') from test; ["ab", "def"] ``` #### 7. 主要負責的產品 這個根據簡歷或者你自己的情況實際實說就行。 #### 8. 產品的指標如何知道帶來多少價值 這題沒有標準答案,根據自己的理解回答即可。 以下僅供參考: 在《精益資料分析》一書中給出了兩套比較常用的指標體系建設方法論,其中一個就是比較有名的**海盜指標法**,也就是我們經常聽到的**AARRR海盜模型**。海盜模型是使用者分析的經典模型,它反映了增長是系統性地貫穿於使用者生命週期各個階段的:`使用者拉新(Acquisition)`、`使用者啟用(Activation)`、`使用者留存(Retention)`、`商業變現(Revenue)`、`使用者推薦(Referral)`。 為什麼要說這個模型呢,因為通過這個模型中的一些關鍵指標我們可以反推出產品的指標所帶來的價值有哪些。 AARRR模型: *A 拉新*: 通過各種推廣渠道,以各種方式獲取目標使用者,並對各種營銷渠道的效果評估,不斷優化投入策略,降低獲客成本。涉及關鍵指標例如 新增註冊使用者數、啟用率、註冊轉化率、新客留存率、下載量、安裝量等,我們通過這些指標就可反應出獲取目標使用者的效果是怎樣的。 *A 活躍*: 活躍使用者指真正開始使用了產品提供的價值,我們需要掌握使用者的行為資料,監控產品健康程度。這個模組主要反映使用者進入產品的行為表現,是產品體驗的核心所在。涉及關鍵指標例如 DAU/MAU 、日均使用時長、啟動APP時長、啟動APP次數等。通過這些指標可以反映出使用者的活躍情況。 *R 留存*: 衡量使用者粘性和質量的指標。涉及關鍵指標例如 留存率、流失率等。通過這些指標可以反映出使用者的留存情況。 *R 變現*: 主要用來衡量產品商業價值。涉及關鍵指標例如 生命週期價值(LTV)、客單價、GMV等。這些指標可以反映出產品的商業價值。 *R 推薦*: 衡量使用者自傳播程度和口碑情況。涉及關鍵指標例如 邀請率、裂變係數等。 #### 9. 指標如何做到精準 同上題,沒有標準答案。 僅供參考: 指標要做到精準,就必須使用科學方法選指標。 選指標常用方法是**指標分級方法**和**OSM模型**。 *1. 指標分級方法*:指標分級主要是指標內容縱向的思考,根據企業戰略目標、組織及業務過程進行自上而下的指標分級,對指標進行層層剖析,主要分為三級T1、T2、T3。 - T1指標: **公司戰略層面指標** 用於衡量公司整體目標達成情況的指標,主要是決策類指標,T1指標使用通常服務於公司戰略決策層。 - T2指標: **業務策略層面指標** 為達成T1指標的目標,公司會對目標拆解到業務線或事業群,並有針對性做出一系列運營策略,T2指標通常反映的是策略結果屬於支援性指標同時也是業務線或事業群的核心指標。T2指標是T1指標的縱向的路徑拆解,便於T1指標的問題定位,T2指標使用通常服務業務線或事業群。 - T3指標: **業務執行層面指標** T3指標是對T2指標的拆解,用於定位T2指標的問題。T3指標通常也是業務過程中最多的指標。根據各職能部門目標的不同,其關注的指標也各有差異。T3指標的使用通常可以指導一線運營或分析人員開展工作,內容偏過程性指標,可以快速引導一線人員做出相應的動作。 *2. OSM模型*(Obejective,Strategy,Measurement):是指標體系建設過程中輔助確定核心的重要方法,包含**業務目標、業務策略、業務度量**,是指標內容橫向的思考。 *O*: 使用者使用產品的目標是什麼?產品滿足了使用者的什麼需求?主要從使用者視角和業務視角確定目標,原則是切實可行、易理解、可干預、正向有益。 *S*: 為了達成上述目標我採取的策略是什麼? *M*: 這些策略隨之帶來的資料指標變化有哪些? #### 10. 就專案中提到的某個實體,講一下他對應的屬性有哪些 實際專案問題,根據簡歷中寫的敘述。 這裡也給我們提個醒:簡歷中所寫的專案我們必須**非常熟悉**才行,並且我們需要熟悉所寫專案的整個生命週期,包括專案開發 `前中後` 期的所有內容,說的時候可以比簡歷上寫的更詳細,但是千萬不能和簡歷上有出入。 #### 11. 如果你建模的話,你會如何建模 具體的建模可看這篇文章:[數倉建設中最常用模型--Kimball維度建模詳解](https://mp.weixin.qq.com/s/eRrJGD_2CynvUYbClMcUvg) 以下內容擷取自上述文章 提到建模,就牢記*維度建模四步走*,模型怎麼建,就圍繞以下四步敘說: ![維度建模四步走](https://cdn.jsdelivr.net/gh/sunmyuan/cdn/201231_1.png) **1、選擇業務過程** 維度建模是緊貼業務的,所以必須以業務為根基進行建模,那麼選擇業務過程,顧名思義就是在整個業務流程中選取我們需要建模的業務,根據運營提供的需求及日後的易擴充套件性等進行選擇業務。 **2、宣告粒度** 從關注原子粒度開始設計,也就是從最細粒度開始,因為原子粒度能夠承受無法預期的使用者查詢。但是上卷彙總粒度對查詢效能的提升很重要的,所以對於有明確需求的資料,我們建立針對需求的上卷彙總粒度,對需求不明朗的資料我們建立原子粒度。 **3、確認維度** 維度表是作為業務分析的入口和描述性標識,所以也被稱為資料倉庫的“靈魂”。宣告完粒度之後,就要確定哪些屬性是維度,那麼怎麼確定哪些屬於維度屬性呢,這裡就不詳細展開了,可以點選上面的文章連結,有詳細說明。 **4、確認事實** 維度建模的核心原則之一*是同一事實表中的所有度量必須具有相同的粒度*。這樣能確保不會出現重複計算度量的問題。有時候往往不能確定該列資料是事實屬性還是維度屬性。記住*最實用的事實就是數值型別和可加類事實*。 這塊內容太多了,說完以上四步之後可以在**具體的聊下數倉是怎麼分層的,每層都存放什麼資料**等。具體文章可點選:[結合公司業務分析離線數倉建設](https://mp.weixin.qq.com/s/uUcQZNcRhnK64Al4KIUTeQ) #### 12. 主要都抽取哪些資料來源,使用什麼工具 根據簡歷的專案回答。 以下僅供參考,主要抽取的資料: 1. 業務庫資料,使用sqoop進行抽取 2. 流量日誌資料,使用flume實時採集 3. 第三方公司資料,使用通用介面採集 #### 13. 描述一下抽取的內部邏輯,怎麼實現的 根據簡歷的專案回答。 以下僅供參考: 在開始建立抽取系統之前,需要一份邏輯資料對映,它描述了那些**提交到前臺的表中原始欄位和最終目標欄位之間的關係**。該文件貫穿ETL系統。 設計邏輯: 1. 有一個規劃 2. 確定候選的資料來源 3. 使用資料評估分析工具分析源系統 4. 接受資料線和業務規則的遍歷 5. 充分理解資料倉庫資料模型 6. 驗證計算和公式的有效性 **邏輯資料對映的組成**:目標表名稱、表型別、SCD(緩慢變化維度)、源資料庫、源表名稱、源列名稱、轉換。 這個表必須清晰的描述在轉換的過程中包含的流程,不能有任何疑問的地方。 表型別給了我們資料載入過程執行的次序:先是維表,然後是事實表。 與表型別一起,載入維表過程SCD型別很重要,開發之前需要理解哪些列需要保留歷史資訊以及如何獲取歷史資訊所需的策略。 在源系統得到確認和分析之前,完整的邏輯資料對映是不存在的,源系統分析通常分為兩個主要階段:**資料發現階段**,**異常檢測階段**。 資料發現階段:需要ETL小組深入到資料的需求中,確定每一個需要載入到資料倉庫中的源系統,表和屬性,為每一個元素確定適當的源或者記錄系統是一個挑戰,必須仔細評估。 異常檢測階段:檢查源資料庫中每一個外來鍵是否有NULL值。如果存在NULL值,必須對錶進行外關聯。如果NULL不是外來鍵而是一個列,那麼必須有一個處理NULL資料的業務規則。只要允許,資料倉庫載入資料一定用預設值代替NULL。 #### 14. 除了工作,有去讀什麼書學習嗎 僅供參考: 前段時間讀了《數倉工具箱-維度建模權威指南》這本書,受益頗多,對維度建模有了一個清晰的認知,維度建模就是時刻考慮如何能夠提供簡單性,以業務為驅動,以使用者理解性和查詢效能為目標的這樣一種建模方法。 目前正在讀《大資料日知錄:架構與演算法》,這本書涉及到的知識非常多,全面梳理了大資料儲存與處理的相關技術,看書能讓我更加系統化,體系化的學習大資料的技術。 > 注:以上兩本書的電子版,可在`五分鐘學大資料`公眾號後臺獲取,回覆關鍵字:`數倉工具箱` 或 `大資料日知錄` #### 15. 你覺得flink和spark streaming有什麼區別 這個問題是一個非常巨集觀的問題,因為兩個框架的不同點非常之多。但是在面試時有非常重要的一點一定要回答出來:**Flink 是標準的實時處理引擎,基於事件驅動。而 Spark Streaming 是微批( Micro-Batch )的模型**。 下面就分幾個方面介紹兩個框架的主要區別: 1. *架構模型*: - Spark Streaming 在執行時的主要角色包括:Master、Worker、Driver、Executor; - Flink 在執行時主要包:Jobmanager、Taskmanager 和 Slot。 2. *任務排程*: - Spark Streaming 連續不斷的生成微小的資料批次,構建有向無環圖 DAG, Spark Streaming 會依次創DStreamGraph、JobGenerator、JobScheduler; - Flink 根據使用者提交的程式碼生成 StreamGraph,經過優化生成 JobGraph,然後提交給JobManager 進行處理, JobManager 會根據 JobGraph 生成 ExecutionGraph,ExecutionGraph 是 Flink 排程最核心的資料結構,JobManager 根據 ExecutionGraph 對 Job 進行排程。 3. *時間機制*: - Spark Streaming 支援的時間機制有限,只支援處理時間。 - Flink 支援了流處理程式在時間上的三個定義:處理時間、事件時間、注入時間。同時也支援 watermark 機 制來處理滯後資料。 4. *容錯機制*: - 對於 Spark Streaming 任務,我們可以設定 checkpoint,然後假如發生故障並重啟,我們可以從上次 checkpoint 之處恢復,但是這個行為只能使得資料不丟失,可能 會重複處理,不能做到恰好一次處理語義。 - Flink 則使用**兩階段提交協議**來解決這個問題。 Flink的兩階段提交協議具體可以看這篇文章:[八張圖搞懂 Flink 端到端精準一次處理語義 Exactly-once](https://mp.weixin.qq.com/s/WH5KZrh8YMbfFn6GyYUXVA) #### 16. Spark Streaming相比Flink有什麼優點 一般都是問 Flink 比 Spark 有什麼優勢,這個是反過來問的,要注意哦 *微批處理優勢*: Spark Streaming 的微批處理雖然實時性不如Flink,但是微批對於實時性要求不是很高的任務有著很大優勢。 - 比如10W+的資料寫入MySql,假如採用Flink實時處理,Sink 到 MySql 中,Flink是事件驅動的,每條都去插入或更新資料庫,明顯不靠譜,因為資料庫扛不住。假如在Flink的Sink處加上批處理,雖然可以提高效能,但是如果最後一個批次沒有達到批大小閾值,資料就不會刷出進而導致資料丟失。 - Flink是基於狀態的計算,所以在多個視窗內做關聯操作是很難實現的,只能把所有狀態丟到記憶體中,但如果超出記憶體,就會直接記憶體溢位。Spark 因為是基於RDD的可以利用RDD的優勢,哪怕資料超出記憶體一樣算,所以在較粗時間粒度極限吞吐量上Spark Streaming要優於Flink。 *語言優勢*: - Flink和Spark都是由Scla和Java混合程式設計實現,Spark的核心邏輯由Scala完成,而Flink的主要核心邏輯由Java完成。在對第三方語言的支援上,Spark支援的更為廣泛,Spark幾乎完美的支援Scala,Java,Python,R語言程式設計。 #### 17. 有什麼想問的嗎 面試是雙方相互瞭解的過程,所以出於禮貌在面試結束詢問一下你有沒有什麼想問的。當然面試官也想借此瞭解你對他們公司的瞭解程度及感興趣程度。 所以請不要回答“我沒有問題了”,而是要把這個問題當作最後一次發言機會。問的問題要圍繞著這家公司本身,要讓對方覺得你很關心、關注公司。 以下是*可以問的*: 1. 公司對這個崗位的期望是什麼樣的?其中,哪些部分是我需要特別努力的? 2. 是否有資深的人員能夠帶領新進者,並讓新進者有發揮的機會? 3. 公司強調團隊合作。那在這個工作團隊中,哪些個人特質是公司所希望的? 4. 能否為我介紹一下工作環境? 以下是**不該問的**: 1. 薪資待遇 2. 過於高深的問題 3. 超出應聘崗位的問