将flatten和strsplit的输出浇铸到pig中

stszievb  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(351)

我试图用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"

我试图将展平和strsplit操作的输出转换为chararray和int。
请让我知道这是否可以做到
谢谢你的帮助!

xvw2m8pv

xvw2m8pv1#

你的问题是如何使用 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 . 如果你的数据太大,那么忘记这个想法。。。但是如果在同一个文件中有多个分隔符,代码就会变得太混乱。

相关问题