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);

しかし、それは 3 番目のフィールドのメッセージを殺してしまいます。

cmessage をダンプします。

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

コストのかかる正規表現や UDF ローダーを必要としない、このログ ファイルを読み取るためのより良い方法はありますか? Pig には、2 番目のスペースの後に停止すると言う何かがあるはずですか? そうでないかもしれない。

更新:私が欲しいものを修正するだけです:代わりに

(2013-03-28T12:19:03.639648-05:00、ホスト 1、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 に答える