【问题标题】:pig programming to use split on group by having count(*)猪编程通过计数(*)在组上使用拆分
【发布时间】:2017-04-11 19:51:16
【问题描述】:

输入文件是:

2, cornflakes, Regular,General Mills, 12
3, cornflakes, Mixed Nuts, Post, 14
4, chocolate syrup, Regular, Hersheys, 5
5, chocolate syrup, No High Fructose, Hersheys, 8
6, chocolate syrup, Regular, Ghirardeli, 6
7, chocolate syrup, Strawberry Flavor, Ghirardeli, 7

filter3 = LOAD 'location_of_file' using PigStorage('\t') as (item_sl : int, item : chararray, type: chararray, manufacturer: chararray, price : int);

SPLIT filter3 INTO filter4 IF (FOREACH (filter3 GROUP BY item) GENERATE group, COUNT(item < 3)), filter6_pass OTHERWISE;

这就像在具有 count(*)

想要的输出是:

4, chocolate syrup, Regular, Hersheys, 5
5, chocolate syrup, No High Fructose, Hersheys, 8
6, chocolate syrup, Regular, Ghirardeli, 6
7, chocolate syrup, Strawberry Flavor, Ghirardeli, 7

【问题讨论】:

  • 您是否正在查找所有计数 > 3 的项目?
  • 是的,我正在寻找小于 3 的所有项目
  • 我想过滤掉所有小于 3 的项目并得到 count> 3 的项目的输出

标签: count group-by apache-pig


【解决方案1】:

按项目分组,获取计数,然后对计数使用过滤器

A = LOAD 'location_of_file' using PigStorage('\t') as (item_sl : int, item : chararray, type: chararray, manufacturer: chararray, price : int);
B = GROUP A BY item;
C = FOREACH B GENERATE group,COUNT(A.item) AS Total;
D = FILTER C BY Total > 3;
E = JOIN A BY item,D BY $0;
F = FOREACH E GENERATE $0..$4;
DUMP F;

【讨论】:

  • 我需要数据保持不变,这按项目分组并依靠该项目。但我想要的输出应该与实现了过滤器的原始数据集相同
  • 用 D 加入原始数据集并获得所需的列,我已经更新了脚本。
  • 我尝试在多个列(项目、制造商)上进行分组,并以此为基础。我希望输出是原始数据集,没有由 group by 在多列上过滤的记录
  • 我收到此错误:按列分组的数量不匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 2020-02-28
  • 2018-04-28
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多