【问题标题】:Aggregation in MapReduce [closed]MapReduce 中的聚合 [关闭]
【发布时间】:2014-01-10 09:13:05
【问题描述】:

我们如何在 .csv 中找到列的最大和最小元素。

我们应该将什么传递给 mapper 的 context.write(key,value)。

  1. 是否是那个 csv 文件的每一列?

Solution

【问题讨论】:

  • 你不会的。你可以在 reducer 中这样做。
  • Brian Roach 感谢您的回复:那么 mapper 是做什么的呢?

标签: java hadoop mapreduce


【解决方案1】:

这对于一个 SO 问题来说有点宽泛,但我会咬一口。

您的映射器用于将值映射到键。假设您的 CSV 有 4 列数值:

42、71、45、22

您将一个键映射到每个值;实际上,CSV 中的标题是什么样的。假设第 4 列代表“小部件数量”。您将“number_of_widgets”映射为映射器中第 4 列值的键。

reducer 将获取给定键的所有值。 这是你计算出你的最小值/最大值的地方。您只需遍历键的所有值并跟踪最小值和最大值。

【讨论】:

  • 这将花费大量的数据来传输和排序。我只会为每个任务发出一列的最小/最大值,然后最小/最大减速器中的剩余值。
  • 如何发出输入的最小值/最大值(一行)以得到最后列的最小值/最大值?您在哪里保留按列优化?
  • @jtravaglini 映射器可以确定其子集的列最小值和最大值,并使用键 columnname_min 和 columnname_max 发出它们。
  • 在映射器中进行预聚合是可能,但这并不完全简单。如果没有自定义记录阅读器,您将不知道何时到达输入拆分的末尾(例如,映射器没有更多记录)。您必须将逻辑放入 cleanup() 以发出最小值/最大值(在新 API 中;在旧 API 中甚至更丑)
  • 如何将标头与csv文件分开
【解决方案2】:

Mapper 应该转置文件 - 对于读取的每一行,发出作为列号的键和作为列的值的值。

减速器应该最小/最大。对于每个输入键,发出找到的最小值和最大值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2010-10-18
    • 1970-01-01
    • 2014-03-05
    • 2012-12-12
    • 1970-01-01
    相关资源
    最近更新 更多