我有一堆系统日志数据看起来像这样。。。
周一1月1日00:00:01 utc 1970 servername debug crond[123456]:系统消息告诉我一些事情
我不确定它在这里的格式中是否可见,但是servername的每一侧都有一个制表符来分割字符串。所以最初加载它是相当容易的。。。
A = LOAD '/syslogfiles' USING PigStorage('\t') AS (
date:chararray,
host:chararray,
message:chararray);
所以现在我有一个有3个字段的元组。下面是我遇到的问题。这是伪代码,因为我似乎不能得到它的权利。我觉得提取物可能是我要找的,但结果不对。
我想做的是把每个字段进一步拆分,就像
B = FOREACH A <split> date USING PigStorage(' ') AS (
day:chararray,
month:chararray,
numday:int,
time:chararray,
timezone:chararray,
year:int);
所以现在我将有一个包含8个字段的元组,(day,month,numday,time,timezone,year,host,message)
我假设,如果我想使用回答这个问题的相同技巧,我可以继续将时间分割为:如果我想,或者具有某种价值的消息。
2条答案
按热度按时间tez616oj1#
对于这样的任务,首先想到的方法是regex\u extract(),请尝试以下操作:
a=使用pigstorage('\t')作为()加载'/syslogfiles'date:chararray, host:chararray, message:chararray);
b=foreach a generate regex_extract(date,'([a-za-z])[a-za-z][1-31][1-9]:[1-9]:[1-9][a-za-z][0-9]',1)如下day:chararray,(日期,“[a-za-z]([a-za-z])[1-31][1-9]:[1-9*]:[1-9][a-za-z][0-9]*',1)作为month:chararray ...
像上面这样的东西可能会起作用,尽管我的正则表达式可能会变得更简单,如果我考虑的时间更长。
nue99wik2#
你在找
STRSPLIT
内置自定义项。返回一个元组。它基本上是java的String.split()
. 如果你提供limit
参数,您将拥有元组的可预测长度,然后您可以使用FLATTEN
要将字段提升到顶层,请执行以下操作: