在 Pig 中投射 Flatten 和 Strsplit 的输出

Posted

技术标签:

【中文标题】在 Pig 中投射 Flatten 和 Strsplit 的输出【英文标题】:Casting the output from Flatten and Strsplit in Pig 【发布时间】:2015-05-25 11:24:01 【问题描述】:

我正在尝试使用 pig 解析具有多个分隔符的日志提取,示例数据如下所示

CEF:0|NetScreen|Firewall/***||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。

请告诉我是否可以这样做

感谢您的帮助!

【问题讨论】:

这个选角有效吗?我不这么认为...***.com/questions/34727136/pig-casting-datatypes 【参考方案1】:

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

【讨论】:

以上是关于在 Pig 中投射 Flatten 和 Strsplit 的输出的主要内容,如果未能解决你的问题,请参考以下文章

FLATTEN 或 SUBSTRING 与 Pig 中的 JOIN 混淆

猪:FLATTEN关键字

展平字符串后 Pig 中的模式

Apache Pig Group / 展平 / 加入

Pig Latin 中的 AVG() 函数问题

Pig UDF - 将动态模式作为一组字段(不是元组)返回