使用 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 key
和 record as value
,并将标识符附加为记录的前缀。假设第一个数据集的前缀是 "game",第二个数据集的前缀是 "age"。这是识别 Reducer
中的记录所必需的。 Reducer
将在列表中为每个键接收两个值(假设数据中没有重复项)。标识符将帮助我们识别记录,我们将创建一个 new record
,它将包含有关用户的所有信息,如 gameName
、score
和 age
。减速器的输出将有 gameName as key
和 record as value
。 (如果你想优化那么你可以只发出用户的年龄。)
其次,第一个 MapReduce 作业的输出是 GameName as Key
和 Record as Value
。这将是下一个 AvgAgePerGame MapReduce 作业的输入。它将具有 身份映射器 ,它将输入作为映射器输出发出。现在在 reducer 中,您将收到 GameName as key
和 list of records
(年龄列表)作为值。您可以在 reduce 方法中将玩家的年龄相加并除以玩家数量。输出密钥(游戏名称)和平均值。年龄值。
@YoungHobbit 给出的答案是正确的。您的问题的解决方案可以通过使用 MutlipleInputFormat
和 Chaining 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 中的自述文件。
我有两个 csv
文件。一个有 (user_id, gameName,score)
,另一个有 (user_id, age)
。我如何使用 map reduce 编程执行连接,以便我可以计算每个游戏玩家的平均年龄。我不知道如何继续这个。
您可以使用两个 MapReduce 作业来实现此目的。首先,加入两个数据集。二、计算场均球员年龄
我们将数据集 (user_id ,gameName,score)
称为 GameSet
并将 (user_id ,age)
称为 AgeSet
.
首先,JoinMapreduce 作业将为每个数据集分别定义两个映射器。这些映射器任务将输出 user_id as key
和 record as value
,并将标识符附加为记录的前缀。假设第一个数据集的前缀是 "game",第二个数据集的前缀是 "age"。这是识别 Reducer
中的记录所必需的。 Reducer
将在列表中为每个键接收两个值(假设数据中没有重复项)。标识符将帮助我们识别记录,我们将创建一个 new record
,它将包含有关用户的所有信息,如 gameName
、score
和 age
。减速器的输出将有 gameName as key
和 record as value
。 (如果你想优化那么你可以只发出用户的年龄。)
其次,第一个 MapReduce 作业的输出是 GameName as Key
和 Record as Value
。这将是下一个 AvgAgePerGame MapReduce 作业的输入。它将具有 身份映射器 ,它将输入作为映射器输出发出。现在在 reducer 中,您将收到 GameName as key
和 list of records
(年龄列表)作为值。您可以在 reduce 方法中将玩家的年龄相加并除以玩家数量。输出密钥(游戏名称)和平均值。年龄值。
@YoungHobbit 给出的答案是正确的。您的问题的解决方案可以通过使用 MutlipleInputFormat
和 Chaining 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 中的自述文件。