使用 Map Reduce 编程加入

Joins using Map Reduce programming

我有两个 csv 文件。一个有 (user_id, gameName,score),另一个有 (user_id, age)。我如何使用 map reduce 编程执行连接,以便我可以计算每个游戏玩家的平均年龄。我不知道如何继续这个。

您可以使用两个 MapReduce 作业来实现此目的。首先,加入两个数据集。二、计算场均球员年龄

我们将数据集 (user_id ,gameName,score) 称为 GameSet 并将 (user_id ,age) 称为 AgeSet.

首先,JoinMapreduce 作业将为每个数据集分别定义两个映射器。这些映射器任务将输出 user_id as keyrecord as value,并将标识符附加为记录的前缀。假设第一个数据集的前缀是 "game",第二个数据集的前缀是 "age"。这是识别 Reducer 中的记录所必需的。 Reducer 将在列表中为每个键接收两个值(假设数据中没有重复项)。标识符将帮助我们识别记录,我们将创建一个 new record,它将包含有关用户的所有信息,如 gameNamescoreage。减速器的输出将有 gameName as keyrecord as value。 (如果你想优化那么你可以只发出用户的年龄。)

其次,第一个 MapReduce 作业的输出是 GameName as KeyRecord as Value。这将是下一个 AvgAgePerGame MapReduce 作业的输入。它将具有 身份映射器 ,它将输入作为映射器输出发出。现在在 reducer 中,您将收到 GameName as keylist of records(年龄列表)作为值。您可以在 reduce 方法中将玩家的年龄相加并除以玩家数量。输出密钥(游戏名称)和平均值。年龄值。

@YoungHobbit 给出的答案是正确的。您的问题的解决方案可以通过使用 MutlipleInputFormatChaining jobs.

ReduceSide joins 的组合来实现

我已经为这个问题实现了完整的 MapReduce 代码,可以在我的 github 存储库 here 中找到。

我们需要使用 2 个映射器,即 GameMapper 和 AgeMapper 来处理我们需要加入的 2 个文件。这可以通过 MultipleInputFormat.

来实现

接下来我们使用reducer 连接来自两个映射器的数据并将输出写入HDFS。这可以通过 Reduce Side Joins

来实现

接下来我们编写另一个 MR 作业,它使用前一个 MR 作业的输出作为输入。此映射器将游戏名称作为键,将年龄作为每条记录的值。

最后编写了一个 reducer,其中发生逻辑以找出每个 game.The 输出的用户的平均年龄,然后将其写入 HDFS。

在我的实现中,两个 MR 作业都是从单个驱动程序 class 调用的。这是通过 Chaining Jobs.

实现的

有关我解决此问题的更多信息,请查看 github 存储库 here 中的自述文件。