1

我正在尝试读取内容如下所示的日志文件:

2013-03-28T12:19:03.639648-05:00 host1 rpcbind:rpcbind 终止信号。使用“rpcbind -w”重新启动
2013-03-28T12:20:33.158823-05:00 host2 rpcbind:rpcbind 终止于信号。使用“rpcbind -w”重新启动

我试过像这样使用 PigStorage 空间分隔符:

cmessages = LOAD 'data.txt' USING PigStorage(' ') AS (date:chararray, host:chararray, message:chararray);

但这会扼杀第三个领域的信息,我认为这在以后可能会有用。

转储消息;

<snip>
(2013-03-28T12:19:03.639648-05:00,host1,rpcbind:)
(2013-03-28T12:20:33.158823-05:00,host2,rpcbind:)
</snip>

有没有更好的方法来读取这个不需要昂贵的正则表达式或 UDF 加载器的日志文件?Pig中应该有一些东西可能会在第二个空格之后说停止?也许不吧。

更新:只是为了修改我想要的:而不是

(2013-03-28T12:19:03.639648-05:00,host1,rpcbind:)

我想要:

(2013-03-28T12:19:03.639648-05:00,host1,rpcbind:rpcbind 终止信号。使用“rpcbind -w”重新启动)

本质上,我想要元组的最后一个字段中的完整日志消息。我希望这更清楚。

4

1 回答 1

1

如果不确切知道控制日志的规则,就没有完美的解决方案,但是如果您假设日期和主机具有固定长度,则可以使用以下内容:

A = load 'mydata' as (log:charray);
B = foreach A generate SUBSTRING(name, 0, 31) AS date, 
                       SUBSTRING(name, 33, 37) AS host, 
                       SUBSTRING(name, 39, 255) AS message;

如果仅知道它们由前 2 个空格分隔,则可以使用以下内容:

A = load 'mydata' as (log:charray);
B = foreach A generate log, INDEXOF(log, ' ', 0) as index;
C = foreach B generate log, index, INDEXOF(log, ' ', index + 1) AS index2;
D = foreach C generate SUBSTRING(log, 0, index) AS date, 
                       SUBSTRING(log, index + 1, index2) as host, 
                       SUBSTRING(log, index2+1, 255) as message;

您必须了解有关日志的“规则”,然后选择适当的方法。在这里,我还假设您最长的日志是 256 个字符长。

于 2013-04-02T16:43:27.773 回答