Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hadoop MapReduce中数值数据集的分块_Java_Hadoop_Mapreduce - Fatal编程技术网

Java Hadoop MapReduce中数值数据集的分块

Java Hadoop MapReduce中数值数据集的分块,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我能够使用Hadoop MapReduce在数据挖掘中执行一些预处理步骤。 其中之一就是正常化。 说 进入 像wise一样,我能够对数字数据进行装箱,比如iris.csv 我算出了它背后的数学 虹膜数据集: 找出每个属性的最小值和最大值 在数据集中 萼片长|萼片宽|花瓣长|花瓣宽 最低4.3 | 2.0 | 1.0 | 0.1 最高7.9 | 4.4 | 6.9 | 2.5 然后,我们应该将每个属性的数据值划分为“n”个存储桶。 比如说,n=5 Bucket Width= (Max - Min)

我能够使用Hadoop MapReduce在数据挖掘中执行一些预处理步骤。 其中之一就是正常化。 说

进入

像wise一样,我能够对数字数据进行装箱,比如iris.csv

我算出了它背后的数学

虹膜数据集:

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

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

    最低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提供max和min值,而不是依赖reducer来为您完成工作。我猜这就是你的麻烦开始的地方

    不过,您可以做一件事,在mapper combiner中调用MapReduce设计模式。当每个映射器完成其工作后,它将调用一个名为
    cleanup
    的方法。可以实现“清理”方法,以便它获取每个贴图节点的每个属性的最大值和最小值。这样,您只给reducer(只有一个reducer)一个值为X的集合,即集群中映射器的数量X

    然后,reducer获取每个属性的max和min值,因为这是一个非常短的集合,所以不会有任何问题。最后,将每个属性划分为“n”个存储桶

    网络上有大量关于这种模式的信息,例如。希望能有帮助

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

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


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

    感谢Balduz的回答。是的,你理解了我的问题。我从你的回答中理解的是..如果我错了,请纠正我。为了在MapReduce中进行装箱,我们需要在cleanup()中找到最小值和最大值,并让mapper()通过最小值,减速器的最大值。然后让减速器计算铲斗。因此,如果我们在cleanup()中计算最小值和最大值。映射器将负责收集所有属性val,对吗?那么映射器将发出什么(键可能是csv头,值将是整个列)。因此reducer从cleanup接收数据?对吗?请参阅我的编辑,我试图在评论中回答,但太长了。谢谢Balduz。我将尝试:)。如果我有任何疑问,请更新:)如果它解决了您的问题,请接受我的回答:)每次调用映射器的
    map
    方法时,都会向其传递一行新的csv。在这个方法中,您需要在hashmap中存储给定行的每一列的值。一旦映射器到达
    cleanup
    方法,它将拥有一个hashmap,其中包含映射器传递的csv的所有行。我不知道我刚才说的是否可以理解。。。
    100 1
    100 2
    100 3
    101 2
    101 3
    101 4
    
    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