apache-pig - PIG 如何根据一个不相等的条件组合 2 个文件
问题描述
我正在努力寻找在一年内为球队效力最多的球员。我有一个文件,其中包含 PlayerID、yearID、teamID 的架构。我将文件带入两次以尝试加入 PlayerID 和 yearID 相等但 teamID 不相等的位置。我如何在 PIG 中工作?我可以在 join 语句中使用 <> 吗?我需要将它们分组并进行比较吗?我知道 sql 我可以加入基于 PlayerID 和 yearID 相等且 teamID 不相等但不知道如何在 PIG 中执行此操作。
我试过了,但它的语法不正确”
batters = LOAD 'hdfs:/user/maria_dev/pigtest/Batting.csv' USING PigStorage(',') AS
(id:chararray,yearid:int, teamid:chararray);
batters1 = LOAD 'hdfs:/user/maria_dev/pigtest/Batting.csv' USING PigStorage(',') AS ` (id:chararray,yearid:int, teamid:chararray);
batter_fltr = FILTER batters BY (yearid > 0) AND (teamid> ' ');
batter1_fltr = FILTER batters1 BY (yearid>0) AND (teamid> ' ');
multi_playr = JOIN batter_fltr BY (yearid,id), batter1_fltr BY(yearid,id) ,LEFT OUTER BY(teamid);
解决方案
您想找到一年内在球队中出场次数最多的球员。因此,您应该按球员和年份分组,然后您可以计算每个球员每年的球队数量。最后,按计数降序排列数据 - 第一个结果将是您的答案。无需两次加载数据或进行连接。
batters = LOAD 'hdfs:/user/maria_dev/pigtest/Batting.csv' USING PigStorage(',') AS
(id:chararray, yearid:int, teamid:chararray);
-- Apply filtering as needed here
teams_per_year = FOREACH (GROUP batters BY (id, yearid))
GENERATE
group.id AS id,
group.yearid AS yearid,
COUNT(batters.teamid) AS num_teams;
ordered_results = ORDER teams_per_year BY num_teams DESC;
DUMP ordered_results;
如果您需要不同数量的团队,请添加嵌套DISTINCT
:
teams_per_year = FOREACH (GROUP batters BY (id, yearid)) {
dist_teams = DISTINCT batters.teamid;
GENERATE
group.id AS id,
group.yearid AS yearid,
COUNT(dist_teams) AS num_teams;
}
推荐阅读
- php - php mysql中的多行插入错误
- javascript - 如何根据angularjs中的json值修改ng重复的特定div
- ruby-on-rails - ActiveRecord::Associations::Preloader 只预加载一些关系
- assembly - 开始组装,简单的计算器问题
- javascript - 无法从新窗口获取隐藏值(角度/javascript)
- sql - 将声明的变量设置为 2 个连接列
- php - 如何在laravel中输出奇偶行
- angular - 如何获取价值而不是Angular Reactive表单控件的viewValue?
- python - 查找数组中匹配某个条件的第一个元素的索引
- c# - C# sql 命令参数没有被使用?