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(month,day,time) 并删除“=”之前的信息。我正在使用以下脚本:

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 回答