【问题标题】:Using FILTER after FOREACH in Pig-Latin failed在 Pig-Latin 中的 FOREACH 后使用 FILTER 失败
【发布时间】:2014-08-12 21:03:03
【问题描述】:

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

任务运行良好,但输出结果什么都没有。解释 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
----------------

这是猪的虫子吗?或者有什么好的方法可以避免?

pig --version 在我的电脑上是:

Apache Pig version 0.9.2 (r1232772)
compiled Jan 18 2012, 07:57:19

【问题讨论】:

  • 它可能不成熟,但我笑了。
  • 是否有什么阻止您使用第二条路由并在 LOAD 语句中使用 AS 分配架构?这似乎不仅是一个可行的解决方案,而且是更高效的编码。

标签: hadoop apache-pig


【解决方案1】:

有趣的是,这似乎是一个已知问题,并被视为“无法修复”,因此它并不是真正的错误。这是一种奇怪的行为,似乎可以解释我过去在使用 FILTER 功能时所经历的一些怪癖。

以下内容类似,并在评论流中以“不会修复”关闭: https://issues.apache.org/jira/browse/PIG-1341

在加载过程中,演员阵容似乎确实存在微妙之处,这可能对其他人有所帮助: http://ofps.oreilly.com/titles/9781449302641/data_model.html#type_strength

前面的答案是正确的——我已经确认它确实返回了预期的结果。

这可能会促使我在未来明确投放更多内容 - 很好的问答。很抱歉没有添加任何内容...但认为围绕该主题发布的内容已经足够多。

【讨论】:

    【解决方案2】:

    我知道在 GENERATE 中,这为数据提供了一个类型,但不执行真正的强制转换:

    GENERATE $0 AS i0:chararray
    

    您需要手动投射:

    t1 = FOREACH t GENERATE (chararray) $0 AS i0, (chararray) $1 AS i1, (chararray) $2 AS i2;
    

    这是反直觉的,可能是一个错误。

    【讨论】:

    • 只是为了其他用户的教化:这不是一个“技巧”。这是一个标准的 Java 风格的转换操作符。
    【解决方案3】:

    这应该可行:

    t = LOAD 'test.txt' USING PigStorage(',') AS (i​​0:int, i1:int, i2:int);

    t = FILTER t BY i0 == 3;

    转储时间;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多