我正在尝试读取内容如下所示的日志文件:
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'使用PigStorage('')AS(日期:chararray, 主持人:chararray,消息:chararray);
但是这会消除第三个字段中的消息,我认为这可能会在以后有用。
dump cmessages;
<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”重新启动)
基本上,我想在元组的最后一个字段中显示完整的日志消息。我希望这更清楚。
答案 0 :(得分: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个字符。