我是Pig-Latin的初学者,我发现有关FILTER语句的问题。看一下这个例子:
假设我们有一个数据文件(test.txt),其内容为:
1,2,3
2,3,4
3,4,5
4,5,6
我想选择第一个字段为'3'的记录。 Pig脚本是:
t = LOAD 'test.txt' USING PigStorage(',');
t1 = FOREACH t GENERATE $0 AS i0:chararray, $1 AS i1:chararray, $2 AS i2:chararray;
f1 = FILTER t1 BY i0 == '3';
DUMP f1
任务运行良好,但输出结果为空。 EXPLAIN f1显示:
#--------------------------------------------------
# Map Reduce Plan
#--------------------------------------------------
MapReduce node scope-27
Map Plan
f1: Store(fakefile:org.apache.pig.builtin.PigStorage) - scope-26
|
|---f1: Filter[bag] - scope-22
| |
| Equal To[boolean] - scope-25
| |
| |---Project[chararray][0] - scope-23
| |
| |---Constant(3) - scope-24
|
|---t1: New For Each(false,false,false)[bag] - scope-21
| |
| Project[bytearray][0] - scope-15
| |
| Project[bytearray][1] - scope-17
| |
| Project[bytearray][2] - scope-19
|
|---t: Load(file:///Users/woody/test.txt:PigStorage(',')) - scope-14--------
Global sort: false
----------------
但是,如果我将头2行更改为:
t1 = LOAD 'test.txt' USING PigStorage(',') AS (i0:chararray, i1:chararray, i2:chararray)
(即在LOAD语句中分配模式)
任务运作良好,结果也正确。在这种情况下,EXPLAIN f1显示:
#--------------------------------------------------
# Map Reduce Plan
#--------------------------------------------------
MapReduce node scope-33
Map Plan
f1: Store(fakefile:org.apache.pig.builtin.PigStorage) - scope-32
|
|---f1: Filter[bag] - scope-28
| |
| Equal To[boolean] - scope-31
| |
| |---Project[chararray][0] - scope-29
| |
| |---Constant(3) - scope-30
|
|---t1: New For Each(false,false,false)[bag] - scope-27
| |
| Cast[chararray] - scope-19
| |
| |---Project[bytearray][0] - scope-18
| |
| Cast[chararray] - scope-22
| |
| |---Project[bytearray][1] - scope-21
| |
| Cast[chararray] - scope-25
| |
| |---Project[bytearray][2] - scope-24
|
|---t1: Load(file:///Users/woody/test.txt:PigStorage(',')) - scope-17--------
Global sort: false
----------------
这是猪的虫子吗?或者有什么好方法可以避免它吗?
猪 - 我电脑上的版本是:Apache Pig version 0.9.2 (r1232772)
compiled Jan 18 2012, 07:57:19
答案 0 :(得分:2)
以下内容类似,并在评论信息流中以“不会修复”结束: https://issues.apache.org/jira/browse/PIG-1341
在加载过程中,模型中似乎存在微妙之处,这可能对其他人有所帮助: http://ofps.oreilly.com/titles/9781449302641/data_model.html#type_strength
之前的答案是现货 - 我已经确认它确实会返回预期的结果。
这可能会促使我在将来明确投出更多 - 很棒的问题和答案。抱歉没有添加任何东西......但是认为有足够的主题可以发布。
答案 1 :(得分:1)
我知道在GENERATE中,这会为数据提供一个类型,但不会执行实际的转换:
GENERATE $0 AS i0:chararray
您需要手动投射:
t1 = FOREACH t GENERATE (chararray) $0 AS i0, (chararray) $1 AS i1, (chararray) $2 AS i2;
这是反直觉的,可能是一个错误。
答案 2 :(得分:0)
这应该有效:
t = LOAD'test.txt'使用PigStorage(',')AS(i0:int,i1:int,i2:int);
t = FILTER t BY i0 == 3;
DUMP t;