1

生データに対して豚の処理を行って、そこから何らかの構造を作成しています。

サンプルデータは次のとおりです。

Nov 1   18:23:34    dev_id=03   user_id=0123    int_ip=198.0.13.24 response_code=5

期待される出力:

(Nov 1 18:23:34, 03, 0123, 198.0.12.24, 5)

CONCAT(月、日、時間) を試み、「=」の前の情報を削除しようとしています。次のスクリプトを使用しています。

A = LOAD '----' using PigStorage('\t') as (m: chararray, d: chararray, t: chararray, devid: chararray, userid: chararray, intip: chararray, response: chararray);

B = foreach A generate CONCAT(CONCAT(CONCAT(CONCAT(mnth, ' '), day), ' '), time);

C = foreach A generate REGEX_EXTRACT(devid, '^.*=(.*)$', 1),REGEX_EXTRACT(userid, '^.*=(.*)$', 1), REGEX_EXTRACT(intip, '^.*=(.*)$', 1),REGEX_EXTRACT(response, '^.*=(.*)$', 1);  

Dump B; Dump C;

出力:

(11 月 1 日 18:23:34)

(03, 0123, 198.0.12.24, 5)

私が必要とする提案:

  1. マージ、ユニオン、および結合 (B、C) して、期待される出力を達成できますか? 共通のフィールドがないので、どうすればそれを行うことができますか。

  2. Map-Reduce プログラムを使用して期待される出力を得るために、スクリプトまたは別の手順を最適化する他の方法はありますか。

返信をお待ちしております。ご協力をお願いいたします。

4

1 に答える 1

0

おそらくあなたの問題は区切り文字にありました。区切り文字として \t を指定しますが (これがデフォルトです)、入力データにはフィールド間にスペースがあります。

動作するコードは次のとおりです。

$ cat input
Nov 1   18:23:34    dev_id=03   user_id=0123    int_ip=198.0.13.24  response_code=5

$ cat script.pig
A = LOAD 'input' as (mnth: chararray, day: chararray, time: chararray, devid: chararray, userid: chararray, intip: chararray, response: chararray);

B = foreach A generate CONCAT(CONCAT(CONCAT(CONCAT(mnth, ' '), day), ' '), time),
REGEX_EXTRACT(devid, '^.*=(.*)$', 1),
REGEX_EXTRACT(userid, '^.*=(.*)$', 1),
REGEX_EXTRACT(intip, '^.*=(.*)$', 1),
REGEX_EXTRACT(response, '^.*=(.*)$', 1);  

DUMP B;

$ pig -x local script.pig
...log messages...
(Nov 1 18:23:34,03,0123,198.0.13.24,5)

それが役立つことを願っています。

于 2013-09-03T18:26:02.570 に答える