1. 程式人生 > >大資料面試題必會2018.01.07

大資料面試題必會2018.01.07

資料分析師常見的10道面試題解答 
1.海量日誌資料,提取出某日訪問百度次數最多的那個IP。 
首先是這一天,並且是訪問百度的日誌中的IP取出來,逐個寫入到一個大檔案中,注意到IP是32位的,最多有個2*32個IP。同樣可以採用對映的方法,比如模1000,把整個大檔案對映為1000個小檔案,再找出每個小檔案中出現頻率最大的IP(可以採用hash_map進行頻率統計,然後再找出頻率最大的幾個)及相應的頻率。然後再在這1000個最大的IP中,找出那個頻率最大的IP,即為所求。 
或者如下闡述: 
演算法思想:分而治之+hash 
IP地址最多有2*32=4G中取值情況,所以不能完全載入到記憶體中處理: 
可以考慮採用“分而治之”的思想,按照IP地址的Hash(IP)24值,把海量IP日誌分別儲存到1024個小檔案中。這樣,每個小檔案最多包含4MB個IP地址; 


對於每一個小檔案,可以構建一個IP為key,出現次數為value的Hash map,同時記錄當前出現次數最多的那個IP地址; 
可以得到1024個小檔案中的出現次數最多的IP,再依據常規的排序演算法得到總體上出現次數最多的IP; 
2.搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。 
假設目前有一千萬個記錄(這些查詢串的重複度比較高,雖然總數是1千萬,如果出去重複後,不超過3百萬個。一個查詢串的重複度越高,說明查詢它的使用者越多,也就是越熱門。)請你統計最熱門的10個查詢串,要求使用的記憶體不超過1G。 
典型的TOP k演算法,還是在這篇文章裡頭有所闡述。文中,給出的最終演算法是: 

第一步,先對這批海量資料預處理,在o(N)的時間內使用Hash表完成統計(之前寫成了排序,特此訂正。July,2011.04.27); 
第二步,藉助這個資料結構,找出Top K,時間複雜度為N’logK。 
即,藉助堆結構,我們可以在log量級的時間內查詢和調整/移動、因此,維護一個K(該題目中是10)大小的小根堆,然後遍歷300萬的Query,分別和根元素進行對比所以,我們最終的時間複雜度是:O(N)+N’O(logK)(N為1000萬,N’為300萬) 
或者:採用trie樹,關鍵字域存該查詢串出現的次數,沒有出現為0.最後用10個元素的最小推來對出現頻率進行排序。 
3.有一個1G大小的檔案,裡面每一行是一個詞,詞的大小不超過16位元組,記憶體限制大小是1M,返回頻數最高的100個詞。 

方案:順序讀檔案中,對於每個詞x,取hash(x)P00,然後按照該值存到5000個小檔案(記為x0,x1,x4999)中。這樣每個檔案大概是200k左右。 
如果其中的檔案超過了1M大小,還可以按照類似的方法繼續往下分,直到分解得到的小檔案的大小都不超過1M。 
對每個小檔案中,統計每個檔案中出現的詞以及相應的頻率(可以採用trie樹/hash_map等)並取出出現頻率最大的100個詞(可以用含100個結點的最小堆)並把100個詞及相應的頻率存入檔案,這樣又得到了5000個檔案,下一步就是把這5000個檔案進行歸併(類似與歸併排序)的過程了。 
4.有10個檔案,每個檔案1G,每個檔案的每一行存放的都是使用者的Query,每個檔案的query都可能重複。要求你按照query的頻度排序。 
還是典型的Top K演算法,解決方案如下: 
方案1:順序讀取10個檔案,按照hash(query)的結果將query寫入到另外10個檔案(記為)中。這樣新生成的檔案每個的大小大約也1G(假設hash函式是隨機的)