当前位置: 首页 > 知识库问答 >
问题:

如何在大型数据集中求全局平均值?

林弘文
2023-03-14

我正在编写简单的mapreduce程序来查找我的数据(许多文本文件)中存在的平均值,最小数字和最大数字。我想使用组合器首先在单个映射器处理的数字中查找所需的内容会使其更有效率。

然而,我关心的事实是,为了能够找到平均、最小数或最大数,我们将要求来自所有映射器(因此所有组合器)的数据进入单个缩减器,以便我们能够找到通用平均、最小数或最大数。这在较大数据集的情况下将是一个巨大的瓶颈。

我相信在hadoop中会有一些解决这个问题的方法,我可能无法想到of.Can有人请指导我。我在几次采访中也被问到过这类问题。

此外,在运行我的“查找平均值”mapreduce程序时,我遇到了一个问题,唯一运行的mapper需要很长时间才能完成。我也增加了地图任务超时,但它仍然卡住了。然而,在标准输出日志的帮助下,我发现我的映射器和组合器可以顺利执行。因此,我无法弄清楚是什么原因导致我的mapreduce工作挂起。

共有3个答案

羿昊英
2023-03-14

从映射输出关键字为null可写,值为(值的和,计数)在reducer中分割值并计数分别对值和计数求总和除以总计数的值从Reducer中输出平均值。

逻辑 2 创建一个可写,它可以保存计数和求和 从 map 传递此变量并使用单个化简器将其减少

公良育
2023-03-14

对于平均值,使用单个减速器,为所有对和值发出相同的键,您希望为其找到平均值,作为值,就像这样(没有组合器,因为平均值不是关联的,即平均值的平均值不是全局平均值)。示例

Mapper 1:1,2,3中的值
Mapper 2:5,10中的值

映射器 1 的值的平均值为 2 = (1 2 3)/3。
映射器 2 的值的平均值为 7.5 = (5 10)/2。
平均值的平均值为 4.75 = (2 7.5)/2。
全球平均值为 4.2 = (1 2 3 5 10)/5。

有关更详细的答案,包括使用组合器的棘手解决方案,请参阅我的幻灯片(从幻灯片7开始),灵感来自Donald Miner的书“MapReduce Design Patterns”。

对于最小值/最大值,执行以下逻辑:

同样,您可以使用单个化简器,所有映射器始终发出相同的键,并且该值是要查找最小值/最大值的每个值。

组合器(与减速器相同)接收一个值列表并发出局部min/max。然后,单个减速器接收本地mins/maxs列表并发出全局min/max(min和max ARE关联)。

在伪代码中:

map (key, value):
emit (1, value);

reduce(key, list<values>): //same are combiner
min = first_value;
for each value
    if value <= min
        min = value;
emit (key, min);
廖弘量
2023-03-14

平均值可以根据数据流计算。请尝试坚持以下内容:

    < li >当前平均值 < li >元素数量

通过这种方式,你可以知道一个传入的号码和一批号码的权重。

以下是一些解决方案

  • 查找-运行-中位数-from-a-stream-of-integers
  • 一个流的平均数
 类似资料:
  • 我想采取以下方法: 并使用Streams api更新它。这是我到目前为止得到的: 有没有办法在不流式传输两次(第二次获得计数)的情况下做到这一点?

  • 问题内容: 我试图显示最高平均工资;但是,我似乎无法使其正常工作。 我可以得到要显示的平均薪水清单: 但是,当我尝试显示具有以下项的最大平均薪水列表时: 它没有运行。我收到“无效标识符”错误。如何使用每个工人的平均工资来找到每个工人的最高平均工资? 谢谢。 问题答案: 由聚合函数(例如avg)产生的列通常获得任意名称。只需为其使用别名,然后在其上进行选择:

  • 我正在编写一个java代码,它在数组中计算N个学生的平均成绩,当我输入像{3,4,3}这样的成绩时,它运行良好,但当我使用像{3.7,2.5,3.2}这样的带有小数的数字时,它开始给我带来错误,我想创建一个数据类型的类,例如学生。 任何帮助都将不胜感激。

  • avg 获得某个列字段的平均值avg($table, $column, $where) table [string] 表名. column [string] 列字段 where (optional) [array] WHERE 条件.avg($table, $join, $column, $where) table [string] The table name. join [array] Tab

  • avg 获得某个列字段的平均值avg($table, $column, $where) table [string] 表名. column [string] 列字段 where (optional) [array] WHERE 条件.avg($table, $join, $column, $where) table [string] The table name. join [array] Tab

  • 问题内容: 如何在MySQL中的日期之间取平均值?我对时间值,小时和分钟更感兴趣。 在具有以下内容的桌子上: 进行如下查询: 编辑: 的作品,但我不知道它是什么返回数据。 问题答案: 这似乎有点骇人听闻,但适用于1970年〜1970年和2030年之间的日期(在32位元弓上)。您实际上是在将日期时间值转换为整数,对其求平均,然后将平均值转换回日期时间值。 可能有更好的解决方案,但这会帮助您紧要关头。