PIG 如何根据一个不相等的条件组合 2 个文件

Posted

技术标签:

【中文标题】PIG 如何根据一个不相等的条件组合 2 个文件【英文标题】:PIG How do I combine 2 files based one not equal condition 【发布时间】:2021-02-21 22:21:15 【问题描述】:

我正在努力寻找在一年内为球队效力最多的球员。我有一个文件,其中包含 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);

【问题讨论】:

【参考方案1】:

您想找到一年内在球队中出场次数最多的球员。因此,您应该按球员和年份分组,然后您可以计算每个球员每年的球队数量。最后,按计数降序排列数据 - 第一个结果将是您的答案。无需两次加载数据或进行联接。

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;

【讨论】:

哇,看起来很简单。不敢相信我没想到。谢谢。

以上是关于PIG 如何根据一个不相等的条件组合 2 个文件的主要内容,如果未能解决你的问题,请参考以下文章

根据 APACHE PIG 中的条件加载数据

如何根据多个条件将 1 个 pandas 数据帧合并或组合到另一个数据帧

Pig:读取多个文件并逐列追加

如何在 PIG Script 中实现 IF ELSE 控制逻辑

如何根据多个条件从 SQL Server 中删除大量数据

如何根据pig中列的不同值拆分关系