我正在尝试使用 PIG 构建非结构化数据以进行一些处理。
以下是数据样本:
Nov 1 18:23:34 dev_id=03 user_id=000 int_ip=198.0.13.24 ext_ip=68.67.0.14 src_port=99 dest_port=213 response_code=5
预期输出:
Nov 1 18:23:34, 03 , 000, 198.0.13.24, 68.67.0.14, 99, 213, 5
我们可以看到数据没有正确分隔(如制表符或逗号),所以我尝试使用 '\t' 加载数据并转储到终端上。
A = LOAD '----' using PigStorage('\t') as (mnth: chararray, day: int, --------);
dump A;
Store A into '\root\output';
输出:
转储输出:
(Nov,1,18:23:34,dev_id=03,user_id=000,int_ip=198.0.13.24,ext_ip=68.67.0.14,src_port=99,dest_port=213,response_code=5)
存储输出:结果存储为与输入相同,而不是转储(逗号分隔)。
Nov 1 18:23:34 dev_id=03 user_id=000 int_ip=198.0.13.24 ext_ip=68.67.0.14 src_port=99 dest_port=213 response_code=5
替代方案:我也尝试使用 DataStorage() 作为 (value: varchar) 加载数据并执行 TOKENIZE,但无法实现目标。
我需要的更多建议:
因为我将 3 个字段存储为月:“11 月”、日:“1”和时间:“18:23:34”。是否可以将所有三个字段作为时间加入:“Nov 1 18:23:34”。
所有数据都存储有 dev_id=03、user_id=000 等信息,但我需要删除这些信息并存储 03,000,198.0.13.24 等信息。
是否可以使用 PIG 完成所有处理,或者我们需要编写 MapReduce 程序。
编辑:1
收到评论后,我尝试了 REGEX_EXTRACT 单列,效果很好。对于多列,我尝试了 REGEX_EXTRACT_ALL 如下:
A = LOAD '----' using PigStorage('\t') as (mnth: chararray, day: int, dev: chararray, user: chararray --------);
B = foreach A generate REGEX_EXTRACT_All(devid, userid, '(^.*=(.*)$) (^.*=(.*)$)');
Dump B;
我收到错误:
Error: ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1070: Could not resolve REGEX_EXTRACT_All using imports.
我们可以使用 REGEX_EXTRACT_All 提取多个字段吗?