2013-08-20 39 views
0

我有來自存儲在hdfs中的IIS的日誌文件,但由於Web服務器配置,某些日誌沒有所有列或它們以不同的順序出現。我想生成具有共同模式的文件,因此我可以在它們上面定義一個Hive表。操作hadoop中的行數據以添加缺失的列

實施例良好日誌:

#Fields: date time s-ip cs-method cs-uri-stem useragent 
2013-07-16 00:00:00 10.1.15.8 GET /common/viewFile/1232 Mozilla/5.0+Chrome/27.0.1453.116 

實施例記錄與缺少的列(CS-方法和用戶代理缺失):

#Fields: date time s-ip cs-uri-stem 
2013-07-16 00:00:00 10.1.15.8 /common/viewFile/1232 

與缺少的列日誌需要被映射到完全模式等這個:

#Fields: date time s-ip cs-method cs-uri-stem useragent 
2013-07-16 00:00:00 10.1.15.8 null /common/viewFile/1232 null 

不好的日誌可以有任何的組合列已啓用且順序不同。

如何根據日誌文件中的Fields行將可用列映射到完整模式?

編輯: 通常我會通過定義我的列架構作爲字典映射列名索引來解決這個問題。即:col ['date'] = 0 col ['time'] = 1等等然後我會從文件中讀取#Fields行並解析出啓用的列並生成頭文件字典映射頭文件名到文件中的列索引。然後,對於剩餘的數據行,我通過索引知道它的標題,通過header =列名將其映射到我的列模式,然後按正確的順序生成新行,並插入空數據的缺失列。我的問題是我不明白如何在hadoop中執行此操作,因爲每個地圖都是單獨執行的,因此如何與每個地圖共享#Fields信息?

+0

這是不是一個真正的豬的問題。告訴我們你將如何以任何語言解決這個問題,包括僞代碼。如果你被賦予了一個專門的領域,你將如何確定它的含義以及它應該進入哪一列? –

+0

我加了解釋說明如果我可以在處理它們的時候從每個文件中提取和分享字段信息。否則,我認爲RegexSerDe應該能夠映射這些字段,但是當文件中有可用的數據時不會浪費? – smashbourne

回答

1

您可以使用this將標題應用於創建地圖的列。從那裏,你可以使用UDF,如:

myudf.py

#!/usr/bin/python 

@outputSchema('newM:map[]') 
def completemap(M): 
    if M is None: 
     return None 
    to_add = ['A', 'D', 'F'] 
    for item in to_add: 
     if item not in M: 
      M[item] = None 
    return M 

@outputSchema('A:chararray, B:chararray, C:chararray, D:chararray, E:chararray, F:chararray') 
def completemap_v2(M): 
    if M is None: 
     return (None, 
       None, 
       None, 
       None, 
       None, 
       None) 
    return (M.get('A', None), 
      M.get('B', None), 
      M.get('C', None), 
      M.get('D', None), 
      M.get('E', None), 
      M.get('F', None)) 

要在丟失的元組添加到地圖。

樣品輸入:

csv1.in    csv2.in 
-------   --------- 
A|B|C    D|E|F 
Hello|This|is  PLEASE|WORK|FOO 
FOO|BAR|BING  OR|EVERYTHING|WILL 
BANG|BOSH   BE|FOR|NAUGHT 

示例腳本:

A = LOAD 'tests/csv' USING myudfs.ExampleCSVLoader('\\|') AS (M:map[]); 
B = FOREACH A GENERATE FLATTEN(myudf.completemap_v2(M)); 

輸出:

B: {null::A: chararray,null::B: chararray,null::C: chararray,null::D: chararray,null::E: chararray,null::F: chararray} 
(,,,,,) 
(,,,PLEASE,WORK,FOO) 
(,,,OR,EVERYTHING,WILL) 
(,,,BE,FOR,NAUGHT) 
(,,,,,) 
(Hello,This,is,,,) 
(FOO,BAR,BING,,,) 
(BANG,BOSH,,,,)