我有來自存儲在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信息?
這是不是一個真正的豬的問題。告訴我們你將如何以任何語言解決這個問題,包括僞代碼。如果你被賦予了一個專門的領域,你將如何確定它的含義以及它應該進入哪一列? –
我加了解釋說明如果我可以在處理它們的時候從每個文件中提取和分享字段信息。否則,我認爲RegexSerDe應該能夠映射這些字段,但是當文件中有可用的數據時不會浪費? – smashbourne