gpt4 book ai didi

java - Hadoop 映射器 : lines vs files

转载 作者:可可西里 更新时间:2023-11-01 16:55:37 25 4
gpt4 key购买 nike

我正在学习 Hadoop/mapreduce,对拆分映射器的各种可能性有疑问。

在标准的“wordcount”场景中,每个不同的进程都在一个独特的行上工作,并进行一些基本的数学运算(加法)。但是,是否可以让每个进程处理一个唯一的文件?例如,如果我有 500,000 个唯一文件,每个文件大约 5M,我是否可以告诉 Hadoop 每个进程应该对每个文件进行一些分析,然后对分析结果进行统计(例如,将结果一起平均)?

例如,假设每个文件包含:

{name}
{data1}
{data2}
...
{dataN}

我想对这个文件执行一个数学函数来得到F({name}) = [value1, value2, value3] 基于 {data1, ..., dataN},最后,我想找到每个 {name} 的所有可能的 [value1, value2, value3] 数组的平均值。在这种情况下,如果我使用 Hadoop 在每一行上工作,这将无济于事,因为每个 data 必须与 name 相关联,所以我希望 Hadoop 维护知道正在使用哪个 name

如果这是可能的,F 的计算是否是“map”阶段,然后 [value1, value2, value3] 数组的平均是“reduce” '阶段?

因此,将问题合并为一个清晰的单行代码:如何让 Hadoop 拆分文件而不是行?

最佳答案

我们可以获得文件名并将其输出为映射器的输出键。映射器输出值可以是value1,value2,value3等值。获取文件名的代码片段如下

InputSplit split = context.getInputSplit();
String fileName = split.getPath().getName();

在 reducer 部分,我们可以根据这里的文件名键进行迭代,并执行必要的操作,如平均、求和等。reducer 输出可以包含文件名和值。

关于java - Hadoop 映射器 : lines vs files,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30358725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com