最近面試被問到的問題總結(數據研發方向)

一、Linux命令實現單詞計數並排序數組

  cat 目標文件 | awk -F ' ' '{for(i=1;i<=NF;i++){print $i}}' | sort | uniq -c | sort -t ' ' -k1r | awk '{print $2 " " $1}' | more

  解析:awk是一個很是強大的文本編輯命令,參數F是自定義的分隔符,這裏的分隔符是空格,後面跟着awk的程序語言,其意思是打印每一行中的每一個單詞。函數

     sort排序。code

     uniq命令去重,參數c是統計每行數據的頻率,格式爲:頻率 空格 行內容。blog

     sort排序,參數t是自定義分隔符,這裏的分隔符是空格,參數k是按照某幾列排序,根據前面uniq排的序得知頻率在第一位,因此參數k的值爲1,至於參數k跟着的值r是由於sort默認排序是升序,加上r是降序排列。排序

     按照咱們的習慣,都是先打印單詞,而後再打印頻率,因此再次使用了awk調整打印順序。class

二、使用MapReduce程序實現兩個文件(文件1內容:用戶ID,購車記錄;文件2內容:用戶ID,購房記錄)join,要求:打印出同時購房購車的用戶,並將其購車購房記錄輸出,說出思想便可。awk

  解析:在Map端,將兩份文件均分割,直接用上下文context寫出,在寫出時,在value中添加購車或者購房標記(車:car25000.00,房:house1800000.00)。原理

     在Reduce端,因爲在Map處理好的數據已經按照用戶ID處理完畢,其values中保存着用戶的購房或者購車記錄。而後在reduce處理時,先遍歷此集合,若是集合同時包含了car和house,則說明用戶同時購買了車和房,則其實才將其輸出;如若不知足上述條件,就不用Context輸出。遍歷

三、問題2的升級版,現得知用戶購車記錄文件相比購房記錄很是小,因此在MapReduce程序中兩個文件進行join時,Reduce端代價比較大,因此須要你提出一種新的處理方案。提示,容許一部分偏差。二進制

  解析:採用布隆過濾器的思想,咱們先將購車記錄的用戶ID作成一個布隆過濾器(布隆過濾器的原理是:咱們建立一個很是長的二進制數組,而後將存在用戶ID的數據按照某種函數轉換成一個長度跟上述數組長度相等的二進制向量並放入數組中)。咱們在進行Map端操做的時候,對於每個購房的用戶ID都通過一次布隆過濾器,這樣就能夠根據用戶ID是否存在於布隆過濾器判斷該用戶是否在購車的同時購買了房,剔除掉沒有同時購房購車的用戶,並用上下文context寫出。

     在Reduce端,數據量就減少了,這樣就可使Reduce端的壓力減少。

相關文章
相關標籤/搜索