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,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,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,COUNT(dist_teams) AS num_teams;
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...