在Hadoop MapReduce中对数值数据集进行分箱

时间:2014-02-04 13:58:08

标签: java hadoop mapreduce

我可以使用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. 找出每个属性的最小值和最大值 在数据集中。

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

    Min | 4.3 | 2.0 | 1.0 | 0.1

    最大| 7.9 | 4.4 | 6.9 | 2.5

  2. 然后,我们应该将每个属性的数据值分成'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中做同样的事情。 请建议。

1 个答案:

答案 0 :(得分:3)

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

然而,有一件事你可以做,一个名为in-mapper combiner的MapReduce设计模式。当每个映射器完成其工作时,它会调用一个名为cleanup的方法。您可以实现清理方法,以便获取每个映射节点的每个属性的最大值和最小值。这样,您只为一个具有X值的集合(仅一个reducer)提供X,即X是集群中映射器的数量。

然后,reducer获取每个属性的max和min值,因为它将是一个非常短的集合,因此不会有任何问题。最后,将每个属性划分为'n'桶。

网上有关于此模式的大量信息,例如this tutorial。希望它有所帮助。

编辑:您需要在映射器中创建一个实例变量,您将在map方法中存储每个值,以便它们在{{1}中可用方法,因为它只被调用一次。例如cleanup即可。您需要记住,您无法在HashMap方法的context变量中保存值,在迭代map之后,您需要在cleanup方法中执行此操作并找出每列的最大值和最小值。然后,对于密钥,我不认为在这种情况下它真的很重要,所以是的,你可以使用csv头,并且对于你正确的值,你需要存储整个列。

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

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