2013-09-27 47 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',所以你只需运行一次正则表达式。 –