用于处理原始数据的PIG脚本

时间:2013-08-31 03:07:38

标签: hadoop apache-pig

我正在对我的原始数据进行猪处理以制作一些结构。

以下是样本数据:

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程序优化脚本或不同的过程以获得预期的输出。

  3. 期待回复,非常感谢您的帮助。

1 个答案:

答案 0 :(得分: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)

希望有所帮助。