【问题标题】:Column splitting into groups using pig latin使用猪拉丁文将列分成组
【发布时间】:2016-07-19 17:19:27
【问题描述】:

我有一个包含两列的表(code:chararray, sp:double)

我想将第二个字段 sp 分成不同的组(例如基于 (25 =45) 等条件。

输入

code sp
t001 60.0
t001 75.0
a003 34.0
t001 60.0
a003 23.0
a003 23.0
t001 45.0
t001 10.0
t001 8.0
a003 20.0
t001 38.0
a003 55.0
a003 50.0
t001 08.0
a003 44.0

所需的输出:

code    bin1     bin2        bin3
       (<25)   (>25 <45)    >=45
t001    3          1          4 
a003    3          2          2 

我正在尝试如下脚本:

data = LOAD 'Sandy/rd.csv' using PigStorage(',') As (code:chararray,sp:double);

data2 = DISTINCT data;

selfiltnew = FOREACH data2 generate code, sp;
group_new = GROUP selfiltnew by (code,sp);

newselt = FOREACH group_new GENERATE selfiltnew.code AS code,selfiltnew.sp AS sp;

bin1 = filter newselt by sp < 25.0;
grp1 = FOREACH bin1 GENERATE newselt.code AS code, COUNT(newselt.sp) AS (sp1:double);

bin2 = filter newselt by sp < 45 and sp >= 25;
grp2 = FOREACH bin3 GENERATE newselt.code AS code, COUNT(newselt.sp) AS (sp2:double);

bin3 = filter newselt by sp >=75;
grp3 = FOREACH bin3 GENERATE newselt.code AS code, COUNT(newselt.sp) AS (sp3:double);

newbin = JOIN grp1 by code,grp2 by code,grp3 by code;

newtable = FOREACH newbin GENERATE grp1::group.code AS code, SUM(sp1) AS bin1,SUM(sp2) AS bin2,SUM(sp3) AS bin3;

data2 = FOREACH newtable GENERATE code, bin1, bin2, bin3;
dump newtable;

如何使用 pig latin 获得正确的输出?

【问题讨论】:

  • 请说明你的脚本出了什么问题,你得到了什么而不是预期的结果
  • @YakovL -- 错误出现在 grp1 = FOREACH bin1 GENERATE newselt.code AS 代码,COUNT(newselt.sp) AS (sp1:double);在这里,我想计算所有低于 25 的 sp 的计数。我收到以下错误:无法将 org.apache.pig.builtin.COUNT 的匹配函数推断为多个或都不适合。请使用显式演员表。
  • 我不确定,这个逻辑好不好。有没有最好的分箱解决方案?

标签: apache-pig hadoop2


【解决方案1】:

通过查看您想要的输出,不需要DISTINCT。此外,您无需执行您正在执行的某些步骤。请注意,如果源由空格分隔,则应使用PigStorage(' ') 而不是PigStorage(',') 按照@inquisitive_mind 指出的,代码如下:

data = LOAD 'Sandy/rd.csv' using PigStorage(' ') As (code:chararray,sp:double);
bin1 = filter data by sp < 25.0;
grouped1 = GROUP bin1 by code;
grp1 = FOREACH grouped1 GENERATE group AS code, COUNT(bin1.sp) AS (sp1:double);
bin2 = filter data by (sp >= 25.0 AND sp<45);
grouped2 = GROUP bin2 by code;
grp2 = FOREACH grouped2 GENERATE group AS code, COUNT(bin2.sp) AS (sp2:double);
bin3 = filter data by sp >= 45.0;
grouped3 = GROUP bin3 by code;
grp3 = FOREACH grouped3 GENERATE group AS code, COUNT(bin3.sp) AS (sp3:double);
result= JOIN grp1 BY code, grp2 by code, grp3 by code;
final_result = FOREACH result GENERATE grp1::code as code, grp1::sp1 as bin1, grp2::sp2 as bin2, grp3::sp3 as bin3;

这是输出:

【讨论】:

  • 感谢您的回复。内连接怎么样。如果 grp1、grp2 或 grp3 中的任何一个的 itms 为零,则最终输出为零。使用哪个连接?在我的实际数据集中,我有将近 6 个 grps,并且任何组中的项目都可能为零。
【解决方案2】:

您必须在使用 COUNT 之前使用 GROUP BY

来源: COUNT
用法
使用 COUNT 函数计算袋子中的元素数。 COUNT 需要前面的 GROUP ALL 语句用于全局计数,需要 GROUP BY 语句用于组计数。

bin1 = filter newselt by sp < 25.0;
grouped1 = GROUP bin1 by (newselt.code);
grp1 = FOREACH grouped1 GENERATE group AS code, COUNT(newselt.sp) AS (sp1:double);

【讨论】:

  • 感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多