使用AS与GENERATE后,数据类型不符合预期

时间:2014-06-30 14:23:18

标签: apache-pig

我无法使这个简单的过滤器工作。它在我宣布一个模式之前工作(省略了chararray部分);但是现在它不起作用,我知道该字段绝对是一个字符串值。有人说'完整'而其他人说'不完整'.....它会读取所有记录,但在我过滤时没有找到;

A = load 'file' USING PigStorage('|');
B = FOREACH A GENERATE $48 as wr_sts:chararray,$49 as wr_sts_qlfctn:chararray, $50 as    comment:chararray, $17 as id:chararray;
C = FILTER B BY wr_sts == 'COMPLETE';

这不会带回任何我知道存在的记录......

当我转储B时,它实际上会将正确的记录转储到屏幕上。因此过滤器关系是肯定会被破坏的。

1 个答案:

答案 0 :(得分:0)

当您在AS数据时使用LOAD子句时,Pig会将您的数据解析为正确的数据类型并应用您提供的架构。当您在AS语句中使用GENERATE子句时,Pig会将强制转换为指定的类型;它只是更新架构。

因此,虽然Pig认为wr_stschararray,但在内部它仍然存储为bytearray,并且比较总是失败。如果您要执行以下操作,它将按预期运行:

B = FOREACH A GENERATE (chararray) $48 as wr_sts, $49 as wr_sts_qlfctn:chararray, $50 as    comment:chararray, $17 as id:chararray;

请注意,$48会转换为chararray。这不仅告诉Pig在解析脚本时将其视为模式中的chararray,它实际上将底层Java对象从byte[]转换为String