在Pig-Latin的FOREACH之后使用FILTER失败了

时间:2012-03-15 09:05:25

标签: hadoop apache-pig

我是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

3 个答案:

答案 0 :(得分:2)

有趣的是,这似乎是一个已知的问题,并被视为“不会修复”,所以它不是一个真正的错误。这是一种奇怪的行为,似乎解释了我过去在使用FILTER功能方面遇到的一点困难。

以下内容类似,并在评论信息流中以“不会修复”结束: 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;