【问题标题】:Pig - Multiple Values For KeyPig - 键的多个值
【发布时间】:2012-12-20 02:10:42
【问题描述】:

我编写了一个 Pig 脚本,它将通过 Python UDF 执行一些图像处理。

做了一些操作后,我有类似的东西(例如):

A = load 'data.txt' using PigStorage('|') as (name:chararray, pixelIntensity:float);

B = group A by pixelIntensity;

dump B;

B 是这样的:

(131.0,{(image1,jpg,131.0), (image2.jpg,131.0), (image3.jpg,131.0)})
(140.0,{(image5.jpg,140.0), (image5.jpg,140.0)})
(150.0,{(image4.jpg,150.0})

如果我去

dump A;

我会得到以下信息:

(image1.jpg,131.0)
(image2.jpg,131.0)
(image3.jpg,131.0)
(image4.jpg,150.0)
(image5.jpg,140.0)

所以我基本上使用它们的平均像素强度作为关键对它们进行了分组。

我的问题是这样的:

我是否只能从 B 中的每一行中提取 1 个元素?例如,我会喜欢

(image1.jpg,131.0)
(image4.jpg,150.0)
...

【问题讨论】:

  • 我知道 Pig 有一个 LIMIT 构造,但我不确定它是否可以与 GROUP BY... 一起使用

标签: key apache-pig key-value


【解决方案1】:

带有LIMIT 的嵌套FOREACH 应该可以满足您的需求:

A = LOAD 'data' using PigStorage(',') AS (name:chararray,pixelIntensity:float);
B = GROUP A BY pixelIntensity;
C = FOREACH B {
    D = LIMIT A 1;
    GENERATE flatten(D);
};
STORE C INTO 'res';

【讨论】:

  • 非常感谢,弗雷德!这正是我一直在寻找的:) 请问嵌套的FOREACH 是如何工作的?据我所知,您只取 A 的顶部条目,但为什么要使用 flatten(D) 部分?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
相关资源
最近更新 更多