在 Pig 中转换 Flatten 和 Strsplit 的输出
Casting the output from Flatten and Strsplit in Pig
我正在尝试使用 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([=11=]), FLATTEN(), FLATTEN(),FLATTEN(),FLATTEN(),FLATTEN();
D = FOREACH C GENERATE ,flatten(STRSPLIT(,'"',2)),flatten(STRSPLIT(,'"',2)),,;
E = FOREACH D GENERATE (int)[=11=],(chararray),(chararray),(int),(int) 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。
请告诉我这是否可以完成
感谢您的帮助!
您的问题是如何使用 as
子句。由于您将 as
放在第六个参数之后,它假定您正尝试仅为第六个参数指定该架构。因此,您将六个字段的模式分配给一个字段,因此出现错误。
这样做:
E = FOREACH D GENERATE (int)[=10=] as a:int,(chararray) as b,(chararray) as c,(int) as d,(int) as e;
但是,您正在将 09:41:38"
转换为一个 int,所以一旦您更改它,它就会给您另一个错误。您需要再次检查如何拆分数据。
依我拙见,在 Pig 中处理文件之前,您应该尝试通过分隔符拆分文件,然后使用分隔符加载它们并执行 union
。如果你的数据太大,那么忘记这个想法......但是如果你在同一个文件中有多个分隔符,你的代码会变得太乱。
我正在尝试使用 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([=11=]), FLATTEN(), FLATTEN(),FLATTEN(),FLATTEN(),FLATTEN();
D = FOREACH C GENERATE ,flatten(STRSPLIT(,'"',2)),flatten(STRSPLIT(,'"',2)),,;
E = FOREACH D GENERATE (int)[=11=],(chararray),(chararray),(int),(int) 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。
请告诉我这是否可以完成
感谢您的帮助!
您的问题是如何使用 as
子句。由于您将 as
放在第六个参数之后,它假定您正尝试仅为第六个参数指定该架构。因此,您将六个字段的模式分配给一个字段,因此出现错误。
这样做:
E = FOREACH D GENERATE (int)[=10=] as a:int,(chararray) as b,(chararray) as c,(int) as d,(int) as e;
但是,您正在将 09:41:38"
转换为一个 int,所以一旦您更改它,它就会给您另一个错误。您需要再次检查如何拆分数据。
依我拙见,在 Pig 中处理文件之前,您应该尝试通过分隔符拆分文件,然后使用分隔符加载它们并执行 union
。如果你的数据太大,那么忘记这个想法......但是如果你在同一个文件中有多个分隔符,你的代码会变得太乱。