我可以使用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
找出每个属性的最小值和最大值 在数据集中。
萼片长度|萼片宽度|花瓣长度|花瓣宽度
Min | 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中做同样的事情。 请建议。
答案 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的。