我正在尝试使用pig
解析带有多个分隔符的日志提取,其中的样本数据如下所示CEF:0|NetScreen|Firewall/VPN||traffic:1|Permit|Low| eventId=5
msg=start_time\="2015-05-20 09:41:38" duration\=0 policy_id\=64
我的代码如下:
A = LOAD '/user/cef.csv' USING PigStorage(' ') as
(a:chararray,b:chararray,c:chararray,d:chararray,e:chararray,f:chararray,g:chararray);
B = FOREACH A GENERATE STRSPLIT(SUBSTRING(a, LAST_INDEX_OF(a,'|')+1, (int)SIZE(a)),'=',2),STRSPLIT(b,'=',2),STRSPLIT(c,'=',2),STRSPLIT(d,'=',2),STRSP LIT(e,'=',2),STRSPLIT(f,'=',2),STRSPLIT(g,'=',2);
C = FOREACH B GENERATE FLATTEN($0), FLATTEN($1), FLATTEN($2),FLATTEN($3),FLATTEN($4),FLATTEN($5);
D = FOREACH C GENERATE $2,flatten(STRSPLIT($4,'"',2)),flatten(STRSPLIT($5,'"',2)),$7,$9;
E = FOREACH D GENERATE (int)$0,(chararray)$2,(chararray)$3,(int)$5,(int)$6 as (a:int,b:chararray,c:chararray,D:int,E:int);
现在当我转储E时,我收到错误
grunt> 2015-05-25 04:06:48,092 [main] ERROR org.apache.pig.tools.grunt.Grunt
- ERROR 1031: Incompatable schema: left is
"a:int,b:chararray,c:chararray,D:int,E:int", right is ":int"
我正在尝试将flatten和strsplit操作的输出转换为chararray和int。
请告诉我是否可以这样做
感谢您的帮助!
答案 0 :(得分:0)
您的问题是如何使用as
子句。由于您将as
放在第六个参数之后,因此它假定您尝试仅为该第六个参数指定该架构。因此,您将六个字段的模式分配给一个,因此错误。
这样做:
E = FOREACH D GENERATE (int)$0 as a:int,(chararray)$2 as b,(chararray)$3 as c,(int)$5 as d,(int)$6 as e;
但是,您正在将09:41:38"
强制转换为int,因此一旦更改它就会再次出现错误。您需要再次检查分割数据的方式。
在我看来,你应该尝试在Pig中处理它们之前用分隔符拆分文件,然后用它们的分隔符加载它们并执行union
。如果你的数据太大,那就忘了这个想法...但是如果你在同一个文件中有几个分隔符,你的代码会变得太乱。