我能够使用 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
找出每个属性的最小值和最大值 在数据集中。
萼片长度|萼片宽度|花瓣长度|花瓣宽度
分钟 | 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 中做同样的事情吗? 请建议。
最佳答案
我不确定我是否理解你的问题,但你想要做的是获得该数据集的每个属性的最大值和最小值,然后将它们划分,所有这些都在同一个工作中,对吧?好的,为了划分属性,您需要向 reducer 提供最大值和最小值,而不是依赖 reducer 为您完成工作。我猜这就是您的麻烦开始的地方。
但是,您可以做一件事,即称为映射器内组合器的 MapReduce 设计模式。当每个映射器完成其工作时,它会调用一个名为 cleanup
的方法。您可以实现清理方法,以便它获取每个 map 节点的每个属性的最大值和最小值。这样,您只为 reducer (只有一个 reducer )提供了一个具有 X 值的集合,即集群中映射器的数量 X。
然后,reducer 获取每个属性的最大值和最小值,因为这将是一个非常短的集合,所以不会有任何问题。最后,您将每个属性划分到“n”个桶中。
网络上有大量关于此模式的信息,例如this tutorial。 .希望对您有所帮助。
编辑:您需要在映射器中创建一个实例变量,您将在其中存储 map
方法中的每个值,以便它们在cleanup
方法,因为它只被调用一次。例如 HashMap
就可以了。您需要记住,您不能在 map
方法中将值保存在 context
变量中,您需要在 cleanup
方法中执行此操作,在遍历 HashMap
并找出每一列的最大值和最小值之后。然后,至于 key ,我认为在这种情况下它并不重要,所以是的,您可以使用 csv header ,至于您正确的值,您需要存储整列。
一旦 reducer 收到映射器的输出,您还不能计算桶。请记住,您将收到每个映射器的一个“列”,因此如果您有 20 个映射器,您将收到每个属性的 20 个最大值和 20 个最小值。因此,您需要再次计算最大值和最小值,就像您在映射器的 cleanup
方法中所做的那样,一旦完成,您就可以最终计算桶。
您可能想知道“如果我仍然需要在 reducer 中找到最大值和最小值,那么我可以省略 cleanup
方法并在 reducer 中执行所有操作,毕竟所有代码都是或多或少相同”。但是,要执行您的要求,您只能使用一个 reducer ,因此如果您省略 cleanup
方法并将所有工作留给 reducer ,则吞吐量与在一台没有 Hadoop 的机器。
关于java - Hadoop MapReduce 中数值数据集的分箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21554529/