我有一个看似简单的Pig生成然后过滤问题

时间:2016-03-21 19:43:04

标签: apache-pig

我正在尝试在一个简单的csv文件上运行一个简单的Pig脚本,我无法让FILTER做我想做的事情。我有一个test.csv文件,如下所示:

john,12,44,,0
bob,14,56,5,7
dave,13,40,5,5
jill,8,,,6

这是我的脚本不起作用:

people = LOAD 'hdfs:/whatever/test.csv' using PigStorage(',');
data = FOREACH people GENERATE $0 AS name:chararray, $1 AS first:int, $4 AS second:int;
filtered = FILTER data BY first == 13;
DUMP filtered;

当我转储数据时,一切看起来都不错。我得到了名称以及预期的第一个和最后一个整数。当我描述数据时,一切看起来都很好:

data: {name: bytearray,first: int,second: int}

当我尝试按第一个值为13过滤数据时,我什么都没得到。 DUMP过滤只是不返回任何内容。奇怪的是,如果我把它改成第一个> 13,然后所有"行"将打印出来。

但是,这个脚本有效:

peopletwo = LOAD 'hdfs:/whatever/test.csv' using PigStorage(',') AS (f1:chararray,f2:int,f3:int,f4:int,f5:int);
datatwo = FOREACH peopletwo GENERATE $0 AS name:chararray, $1 AS first:int, $4 AS second:int;
filteredtwo = FILTER datatwo BY first == 13;
DUMP filteredtwo;

filteredtwo和filtered(或者数据和datatwo)有什么区别?我想知道为什么使用GENERATE(即数据)获得的新关系不会像第一个人期望的那样在第一个脚本中进行过滤。

1 个答案:

答案 0 :(得分:1)

在负载本身中指定数据类型。请参阅下面的

people = LOAD 'test5.csv' USING PigStorage(',') as (f1:chararray,f2:int,f3:int,f4:int,f5:int);
filtered = FILTER people BY f2 == 13;
DUMP filtered;

<强>输出

equals

更改要使用的过滤器&gt;给出

filtered = FILTER people BY f2 > 13;

<强>输出

greater

修改

从bytearray转换时,你必须在FOREACH中显式地转换字段的值。这可行。

people = LOAD 'test5.csv' USING PigStorage(','); 
data = FOREACH people GENERATE $0 AS name:chararray,(int)$1 AS f1,(int)$4 AS f2;
filtered = FILTER data BY f1 == 13;
DUMP filtered;