0

我有一堆看起来像这样的系统日志数据......

Mon Jan 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 个字段的元组。这是我遇到麻烦的下一部分。这是伪代码,因为我似乎无法正确理解。我觉得 EXTRACT 可能是我正在寻找的东西,但结果并不正确。

我想要做的是将这些字段中的每一个进一步拆分,所以就像

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

所以现在我会有一个包含 8 个字段的元组,(日、月、numday、时间、时区、年、主机、消息)

我假设如果我想使用相同的技术来回答这个问题,我可以继续将时间划分为:如果我愿意,或者具有某些价值的消息。

4

2 回答 2

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}
于 2013-09-27T15:31:21.827 回答
0

对于这样的任务,第一个想到的方法是 REGEX_EXTRACT() 尝试这样的事情:

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

B = foreach A 生成 REGEX_EXTRACT(date, '([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) as month:chararray ...

像上面这样的东西可能会起作用,尽管如果我考虑更长时间的话,我的正则表达式可能会变得更简单。

于 2013-09-27T15:34:54.090 回答