【问题标题】:Binning for numerical dataset in Hadoop MapReduceHadoop MapReduce 中数值数据集的分箱
【发布时间】:2014-02-05 16:02:13
【问题描述】:

我能够在使用 Hadoop MapReduce 进行数据挖掘时执行几个预处理步骤。 其中之一就是标准化。 说

100,1:2:3
101,2:3:4

进入

100 1
100 2
100 3
101 2
101 3
101 4

同样,我可以对数值数据进行分箱,比如 iris.csv。

我算出了它背后的数学原理

虹膜数据集:http://archive.ics.uci.edu/ml/datasets/Iris

  1. 找出每个属性的最小值和最大值 在数据集中。

    萼片长度|萼片宽度|花瓣长度|花瓣宽度

    最小 | 4.3| 2.0 | 1.0| 0.1

    最大 | 7.9 | 4.4 |6.9 | 2.5

然后,我们应该将每个属性的数据值分成‘n’个桶。 比如说,n=5。

Bucket Width= (Max - Min) /n


Sepal Length= (7.9-4.3)/5= 0.72
So, the intervals will be as follows :
4.3 -   5.02 
5.02 - 5.74
Likewise,
5.74 -6.46
6.46 - 7.18
7.18- 7.9

继续所有属性

我们能在 Mapreduce 中做同样的事情吗? 请提出建议。

【问题讨论】:

    标签: java hadoop mapreduce


    【解决方案1】:

    我不确定我是否理解您的问题,但您想要做的是获取该数据集的每个属性的最大值和最小值,然后将它们划分,所有这些都在同一个工作中,对吗?好的,为了划分属性,您需要为减速器提供最大值和最小值,而不是依赖减速器为您完成工作。我猜这就是你的麻烦开始的地方。

    但是,您可以做一件事,一种称为映射器内组合器的 MapReduce 设计模式。当每个映射器完成其工作时,它会调用一个名为cleanup 的方法。您可以实现 cleanup 方法,以便它获取每个地图节点的每个属性的最大值和最小值。这样,您只给减速器(只有一个减速器)一个具有 X 值的集合,X 是集群中映射器的数量。

    然后,reducer 获取每个属性的最大值和最小值,因为它是一个非常短的集合,所以不会有任何问题。最后,将每个属性分成“n”个桶。

    网络上有很多关于这种模式的信息,例如this tutorial。希望对您有所帮助。

    编辑:您需要在映射器中创建一个实例变量,您将在其中存储map 方法中的每个值,以便它们在cleanup 方法中可用,因为它只被调用一次。例如,HashMap 就可以了。您需要记住,您不能在map 方法中保存context 变量中的值,您需要在遍历HashMap 并找出最大值和最小值之后在cleanup 方法中执行此操作对于每一列。然后,至于键,我认为在这种情况下并不重要,所以可以,您可以使用 csv 标头,至于您正确的值,您需要存储整个列。

    一旦 reducer 接收到 mapper 的输出,您就无法计算存储桶。请记住,每个映射器都会收到一个“列”,因此如果您有 20 个映射器,您将收到每个属性的 20 个最大值和 20 个最小值。因此,您需要再次计算最大值和最小值,就像您在映射器的cleanup 方法中所做的那样,一旦完成,您就可以最终计算桶了。

    您可能想知道“如果我仍然需要在减速器中找到最大值和最小值,那么我可以省略 cleanup 方法并在减速器中执行所有操作,毕竟所有代码或多或少都相同”。但是,要完成您的要求,您只能使用一个 reducer,因此如果您省略 cleanup 方法并将所有工作留给 reducer,吞吐量将与在一台没有 Hadoop 的机器上工作一样。

    【讨论】:

    • 感谢 Balduz 的回复。是的,您理解我的问题。我从您的回答中了解到的是..如果我错了,请纠正我。为了在 MapReduce 中进行分箱,我们需要找到最小值和最大值在 cleanup() 中并让 mapper() 将最小值、最大值传递给 reducer。然后让 reducer 计算桶。因此,如果我们在 cleanup() 中计算 min 和 max,mapper 将负责收集所有的属性 val清理数据?我说的对吗?
    • 查看我的编辑,我试图在评论中回答,但太长了。
    • 谢谢 Balduz。我会尝试 :)。如果我有任何疑问,请更新 :)
    • 如果它解决了你的问题,请接受我的回答:)
    • 每次调用映射器的map 方法时,都会将新的一行csv 传递给它。在此方法中,您需要将给定行的每一列的值存储在哈希图中。一旦映射器到达cleanup 方法,它将有一个哈希图,其中包含映射器传递的所有csv 行。不知道我刚才说的能不能理解……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多