我正在尝试在一个简单的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(即数据)获得的新关系不会像第一个人期望的那样在第一个脚本中进行过滤。
答案 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;
<强>输出强>
更改要使用的过滤器&gt;给出
filtered = FILTER people BY f2 > 13;
<强>输出强>
修改强>
从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;