我正在对我的原始数据进行猪处理以制作一些结构。
以下是样本数据:
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)
我需要的建议:
我可以合并,联盟和加入(B,C)以实现预期的输出吗?由于没有共同领域,我们该怎么做。
是否有其他方法可以使用Map-Reduce程序优化脚本或不同的过程以获得预期的输出。
期待回复,非常感谢您的帮助。
答案 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)
希望有所帮助。