使用Pig读取以空格分隔的文件

时间:2013-04-02 03:42:32

标签: apache-pig

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

  

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”重新启动)

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

1 个答案:

答案 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个字符。