mapreduce案例:获取PI的值

* content:核心思想是向以(0,0),(0,1),(1,0),(1,1)为顶点的正方形中投掷随机点。
* 统计(0.5,0.5)为圆心的单位圆中落点占总落点数的百分比,即可算出单位圆的面积Pi/4,
* 然后乘以4即得到Pi的近似值。从输入文件中读入一行内容。每一行都是一个数字,
* 代表随机投掷那么多点来估算Pi的值。在Mapper中则随机生成指定数量的随机点(x,y)。
* x和y的范围在0-1之间。然后求出(x,y)与(0.5,0.5)的距离。
* 如果超过0.5,则输出

输入的文件内容:即进行的次数

package com.hadoop.Pi;

import java.io.IOException;
import java.util.Random;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

/*
 * @author:翟超科
 * time:2019.9.3
 * content:核心思想是向以(0,0),(0,1),(1,0),(1,1)为顶点的正方形中投掷随机点。
 * 统计(0.5,0.5)为圆心的单位圆中落点占总落点数的百分比,即可算出单位圆的面积Pi/4,
 * 然后乘以4即得到Pi的近似值。从输入文件中读入一行内容。每一行都是一个数字,
 * 代表随机投掷那么多点来估算Pi的值。在Mapper中则随机生成指定数量的随机点(x,y)。
 * x和y的范围在0-1之间。然后求出(x,y)与(0.5,0.5)的距离。
 * 如果超过0.5,则输出
 * */
public class Pi {
    public static class PiMapper
        extends Mapper<Object, Text, Text, IntWritable>{
        //生成一个0-1的随机数
        private static Random rd = new Random();
        //执行map
        public void map(Object key, Text value, Context context
                          ) throws IOException, InterruptedException {
            //实验进行pointNum次
            int pointNum = Integer.parseInt(value.toString());
            for(int i = 0; i < pointNum; i++){
                // 取随机数
                double x = rd.nextDouble();
                double y = rd.nextDouble();
                // 计算与(0.5,0.5)的距离,如果小于0.5就在单位圆里面
                x -= 0.5;
                y -= 0.5;
                double distance = Math.sqrt(x*x + y*y);
                //如果随机点在圆外,定义结果是0,否则为1
                IntWritable result = new IntWritable(0);
                if (distance <= 0.5){
                    result = new IntWritable(1);
                }
                //将键值对交给reduce处理
                context.write(value, result);
            }
        }
    }

    public static class PiReducer
                    extends Reducer<Text,IntWritable,Text,DoubleWritable> {
        //定义结果变量
        private DoubleWritable result = new DoubleWritable();
        public void reduce(Text key, Iterable<IntWritable> values,
                            Context context
                            ) throws IOException, InterruptedException {

            double pointNum = Double.parseDouble(key.toString());
            double sum = 0;
            //求结果等于1的和
            for (IntWritable val : values) {
                sum += val.get();
            }
            //结果*4即为PI值
            result.set(sum/pointNum*4);
            //输出结果到输出文件目录
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf,"calculate pi");
        job.setJarByClass(Pi.class);
        job.setMapperClass(PiMapper.class);
        job.setReducerClass(PiReducer.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(DoubleWritable.class);
        FileInputFormat.addInputPath(job, new Path("hdfs://192.168.13.101:9000/pi"));//输入文件目录
        FileOutputFormat.setOutputPath(job, new Path("hdfs://192.168.13.101:9000/output2"));//输出文件目录
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

原文地址:https://www.cnblogs.com/2016-zck/p/11453465.html

时间: 2024-08-01 18:20:18

mapreduce案例:获取PI的值的相关文章

MapReduce案例运行

从<Hadoop权威指南>选取了一个小案例,在Hadoop集群环境中运行. 1.新建JAVA类,保存书中源代码. [huser@master bin]$ vi URLCat.java import java.io.InputStream; import java.net.URL; import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; import org.apache.hadoop.io.IOUtils; public class URL

JQ获取元素属性值

2019.10.27 更新 通过一段时间的学习发现下面为什么会报错了 因为我都是用原生JS代码创建的DOM对象,而attr方法是属于JQ对象才可使用的方法. 哈哈,自己也真是沙雕呀 ------------------------------------------------------------------------------------------------ 最近在学习JAVA Web,自己也是做个下列表左右选择的小案例. 获取某个元素的属性值一直以为是要调用atrr方法,不过好像

[DevExpress]GridControl 根据RowIndex和VisibleColumnsIndex来获取单元格值

关键代码: /// <summary> /// 根据rowIndex和visibleColumnsIndex来获取单元格可见值 /// </summary> /// <param name="view">GridView</param> /// <param name="rowIndex">rowIndex</param> /// <param name="visibleColu

js获取单选按钮的值

<!DOCTYPE html> <html> <body> <script type="text/javascript"> function select_patten(value) { // varvalue=document.getElementsByName(text).value; //  alert('hello'); alert(value); } </script> //以下这种方式只能获得单个单选按钮的valu

activity之间参数传递&amp;&amp;获取activity返回值&amp;&amp;activity生命周期

Activity之间参数传递 A activity想将参数传给B activity时可以利用Intent将消息带过去 Intent intent = new Intent(this,BActivity.class); intent.putExtra("xxxx", "xxxx"); 数据量多的话可以使用 Bundle bundle = new Bundle(); intent.putExtras(bundle); 获取activity返回值 A activity调用

使用jquery获取radio的值

使用jquery获取radio的值,最重要的是掌握jquery选择器的使用,在一个表单中我们通常是要获取被选中的那个radio项的值,所以要加checked来筛选,比如有以下的一些radio项: 1.<input type="radio" name="testradio" value="jquery获取radio的值" />jquery获取radio的值<br /> 2.<input type="radio

ascii#ascii,对象类中找__repr__,获取其返回值

1 #!/usr/bin/env python 2 #ascii,对象类中找__repr__,获取其返回值 3 class Foo : 4 def __repr__(self): 5 return "hello" 6 7 obj = Foo() 8 r = ascii(obj) 9 print(r )

thinkphp I方法获取不到值、filter_var

用的TP的I方法,设置I('key','',"string") 当前台传入"<>"等html标签的时间发现,I方法获取不到值,追了下Tp的代码.I方法有段这样的代码: $data   =   filter_var($data,is_int($filter) ? $filter : filter_id($filter)); 当用string过滤的时候,相当于filter_var("<ssss>",FILTER_SANITIZ

IE8和IE7如何获取background-position属性值

IE8和IE7如何获取background-position属性值:之所以要单独介绍一下如何获取background-position属性值,是因为在IE8和IE8以下浏览器中存在一定的兼容性问题,下面对此做一下简单介绍,希望能够给需要的朋友带来帮助.一.使用style方式:此方式只能够获取使用style方式定义的css样式属性,代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"&