2013-09-27 82 views
0

我有一大堆的日誌數據,看起來像這樣...拆分元組領域爲進一步領域LOAD後

週一1月1日00:00:01 UTC 1970年服務器名稱調試的crond [123456]:系統消息,提示我的東西

我不確定它在這裏的格式是可見的,但在ServerName的每一邊有一個製表符分裂字符串。所以最初加載它很容易...

A = LOAD '/syslogfiles' USING PigStorage('\t') AS (
date:chararray, 
host:chararray, 
message:chararray); 

所以,現在我有一個3字段的元組。這是我遇到的下一個部分。這是僞代碼,因爲我似乎無法做到。我覺得EXTRACT可能是我正在尋找的東西,但它並不是正確的。

我想要做的就是進一步上升分裂每個這些領域的,所以像

B = FOREACH A <split> date USING PigStorage(' ') AS (
day:chararray, 
month:chararray, 
numday:int, 
time:chararray, 
timezone:chararray, 
year:int); 

所以現在我將有8場,(日,月,numday,時間,時區,一年一個元組,主持人,消息)

我假設如果我想用同樣的技術來回答這個問題,我可以繼續按以下方式分割時間:如果我想,或者帶有一些值的消息。

回答

2

您正在尋找STRSPLIT內建UDF。這返回一個元組。它基本上是Java的String.split()的包裝。如果您提供的limit參數,你會爲你的元組可預測的長度,然後你可以使用FLATTEN推廣領域的頂級:

B = 
    FOREACH A 
    GENERATE 
     FLATTEN(STRSPLIT(date, ' ', 6)) AS (
      day:chararray, 
      month:chararray, 
      numday:int, 
      time:chararray, 
      timezone:chararray, 
      year:int), 
     host, 
     message; 

DESCRIBE B; 
B: {day: chararray,month: chararray,numday: int,time: chararray,timezone: chararray,year: int,host: chararray,message: chararray} 
0

我想到的像任務的第一種方法這是REGEX_EXTRACT()嘗試事端這樣的:

A = LOAD '/ syslogfiles' USING PigStorage( '\ T')AS(日期:chararray, 主機:chararray,消息:chararray);

B =的foreach甲生成REGEX_EXTRACT(日期,「([A-ZA-Z] )[A-ZA-Z] [1-31] [1-9] :[1-9 ] [1-9] * [A-Za-z] * [0-9] ',1)as day:chararray, (date,'[A-Za-z]([A-Za- z] )[1-31] [1-9]:[1-9 *]:[1-9] * [A-Za-z] * [0-9] *',1) :chararray ...

類似上面的東西可能會工作,雖然我的正則表達式可能會變得更簡單,如果我考慮它的更長的時間。

+0

更好的是'REGEX_EXTRACT_ALL',所以你只需運行一次正則表達式。 –