2013-07-03 23 views
0

我是一個完整的初學者豬。我已經安裝了cdh4豬,並且我已連接到cdh4羣集。我們需要處理這些大量的網絡日誌文件(這些文件已經被加載到HDFS中)。不幸的是,日誌語法非常複雜(不是典型的逗號分隔文件)。限制是我目前無法用其他工具預處理日誌文件,因爲它們太大而且無法承受存儲副本。這裏是在日誌原始行:如何使用Pig加載複雜的Web日誌語法?

「2013-07-02 16時17分12秒 -0700」,「C = Thing.Render & d = {%22renderType%22:%22Primary% 22,%22renderSource%22:%22Folio%22%22things%22:[{%22itemId%22:%225442f624492068b7ce7e2dd59339ef35%22%22userItemId%22:%22873ef2080b337b57896390c9f747db4d%22%22listId%22:%22bf5bbeaa8eae459a83fb9e2ceb99930d%22% 22ownerId%22:%222a4034e6b2e800c3ff2f128fa4f1b387%22}],%22redirectId%22:%22tgvm%22%22sourceId%22:%226da6f959-8309-4387-84c6-a5ddc10c22dd%22%22valid%22:假,%22pageLoadId%22 :%224ada55ef-4ea9-4642-ada5-d053c45c00a4%22%22clientTime%22:%222013-07-02T23:18:07.243Z%22%22clientTimeZone%22:5,%22process%22:%22ml.mobileweb。 fb%22,%22c%22:%22Thing.Render%22}「,」http://m.someurl.com/listthing/5442f624492068b7ce7e2dd59339ef35?rdrId=tgvm&userItemId=873ef2080b337b57896390c9f747db4d&fmlrdr=t&itemId=5442f624492068b7ce7e2dd59339ef35&subListId=bf5bbeaa8eae459a83fb9e2ceb99930d&puid=2a4034e6b2e800c3ff2f128fa4f1b387&mlrdr=t「,」Mozilla/5.0 (iPhone; CP U iPhone OS 6_1_3,如Mac OS X)AppleWebKit/536.26(KHTML, ,如Gecko)Mobile/10B329 [FBAN/FBIOS; FBAV/6.2; FBBV/228172; FBDV/iPhone4,1; FBMD/iPhone; FBSN/iPhone OS; FBSV/6.1.3; FBSS/2; FBCR /衝刺; FBID /電話; FBLC/EN_US; FBOP/1]」, 「10.nn.nn.nnn」, 「nn.nn.nn.nn, nn.nn.0.20」

正如你可能已經注意到有內嵌有一些JSON但URL編碼後的url解碼(可豬八戒做URL解碼?)這裏是JSON的樣子:

{「renderType」:「主」, 「renderSource」: 「開本」, 「東西」:[{ 「的itemId」: 「5442f624492068b7ce7e2dd59339ef35」, 「userItemId」: 「873ef2080b337b57896390c9f747db4d」, 「listId」: 「bf5bbeaa8eae459a83fb9e2ceb99930d」, 「OWNERID」: 「2a4034e6b2e800c3ff2f128fa4f1b387」}],「redirectId 「:」 tgvm 「 」的sourceID「: 」6da6f959-8309-4387-84c6-a5ddc10c22dd「, 」有效「:假的,」 pageLoadId 「:」 4ada55ef-4ea9-4642-ada5-d053c45c00a4" , 「clientTime」: 「2013-07-02T23:18:07.243Z」, 「clientTimeZone」:5 「過程」: 「ml.mobileweb.fb」,」 c「:」Thing.Render「}

我需要提取json中的不同字段以及實際上是集合的」things「字段。我還需要提取日誌中的其他查詢字符串值。豬可以直接處理這種源數據,如果可以的話,你能如此友好地指導我如何讓豬能夠解析和加載它?

謝謝!

回答

1

我實驗了很多,學到了很多東西。嘗試了幾個json庫,piggybank和java.net.URLDecoder。甚至嘗試過CSVExcelStorage。我註冊了圖書館,並能部分解決問題。當我針對更大的數據集運行測試時,它開始在源數據的某些行中遇到編碼問題,導致異常和作業失敗。所以最後我用豬的內置功能,正則表達式來提取所需值:

A = load '/var/log/live/collector_2013-07-02-0145.log' using TextLoader(); 
-- fix some of the encoding issues 
A = foreach A GENERATE REPLACE($0,'\\\\"','"'); 
-- super basic url-decode 
A = foreach A GENERATE REPLACE($0,'%22','"'); 

-- extract each of the fields from the embedded json 
A = foreach A GENERATE 
    REGEX_EXTRACT($0,'^.*"redirectId":"([^"\\}]+).*$',1) as redirectId, 
    REGEX_EXTRACT($0,'^.*"fromUserId":"([^"\\}]+).*$',1) as fromUserId, 
    REGEX_EXTRACT($0,'^.*"userId":"([^"\\}]+).*$',1) as userId, 
    REGEX_EXTRACT($0,'^.*"listId":"([^"\\}]+).*$',1) as listId, 
    REGEX_EXTRACT($0,'^.*"c":"([^"\\}]+).*$',1) as eventType, 
    REGEX_EXTRACT($0,'^.*"renderSource":"([^"\\}]+).*$',1) as renderSource, 
    REGEX_EXTRACT($0,'^.*"renderType":"([^"\\}]+).*$',1) as renderType, 
    REGEX_EXTRACT($0,'^.*"engageType":"([^"\\}]+).*$',1) as engageType, 
    REGEX_EXTRACT($0,'^.*"clientTime":"([^"\\}]+).*$',1) as clientTime, 
    REGEX_EXTRACT($0,'^.*"clientTimeZone":([^,\\}]+).*$',1) as clientTimeZone; 

我決定不在的情況下字段的順序不同使用REGEX_EXTRACT_ALL。

+0

編碼令人討厭。但是TextLoader和PigStorage不提供設置編碼的方式。 – zsxwing