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);
}
}

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

  1. Mapreduce案例之Pi值估算

    题目: 这个程序的原理是这样的.假如有一个边长为1的正方形.以正方形的一个端点为圆心,以1为半径,画一个圆弧,于是在正方形内就有了一个直角扇形.在正方形里随机生成若干的点,则有些点是在扇形内,有些点是 ...

  2. 获取字段唯一值工具- -ArcPy和Python案例学习笔记

    获取字段唯一值工具- -ArcPy和Python案例学习笔记   目的:获取某一字段的唯一值,可以作为工具使用,也可以作为函数调用 联系方式:谢老师,135-4855-4328,xiexiaokui# ...

  3. 【Hadoop离线基础总结】MapReduce案例之自定义groupingComparator

    MapReduce案例之自定义groupingComparator 求取Top 1的数据 需求 求出每一个订单中成交金额最大的一笔交易 订单id 商品id 成交金额 Order_0000005 Pdt ...

  4. MVC教程二:从控制器中获取URL的值

    一.从控制器中获取URL的值有三种方式: 1.使用Request.QueryString[] 例如: string value = Request.QueryString["BookId&q ...

  5. JQ获取元素属性值

    最近在学习JAVA Web,自己也是做个下列表左右选择的小案例. 获取某个元素的属性值一直以为是要调用atrr方法,不过好像获取元素的数组形式再遍历每个元素的时候想获取到它的属性值用attr方法有问题 ...

  6. jquery 获取css3 transform 值

    最近写了个旋转,有要求获取transform值.当看到console.log($("#id").css("transform"))的值的时候,我的内心是崩溃的 ...

  7. grails项目获取前后台的值

    grails项目中前台传值给后台: 加入我有a.gsp这个页面,a.gsp中有如下代码: 姓名:<input type="text" name="xing" ...

  8. C#获取存储过程返回值和输出参数值的方法

    //转自网络,先留个底 1.获取Return返回值 //存储过程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @ ...

  9. 在java中获取attr的值

    首先说如何获取已经在style里面定义好的attr的值,以colorPrimary为例: TypedValue value = new TypedValue(); mContext.getTheme( ...

随机推荐

  1. unity里framebuffer fetch相关问题

    https://docs.unity3d.com/Manual/SL-PlatformDifferences.html 开了framebuffer fetch 如果你再在里面sample 那张rt ( ...

  2. PHP函数相关知识点

    回调函数 <?php function myfunc($funcname,$name) { $name = "喜欢".$name; $funcname($name); } f ...

  3. django session 加密cookie型

    a. 配置 settings.py           SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引 ...

  4. JS !function 稀奇古怪的写法

    !function(){alert("Execute after ()fun!")}(alert("Execute Firstly!")) 注意上面的执行顺序

  5. OFDM时域削峰法降峰均比的原理及影响

    以下是对实验室师兄答疑的转述,经加工后的文字不可避免的存在一些噪声,仅供参考: 时域削峰为非线性变换,效果上相当于将时域中功率较大值的信号点,减去一个合适的“抵消”信号点的功率,使其降低到所设置的门限 ...

  6. CentOS6与7区别整理

    (1)桌面系统 [CentOS6] GNOME 2.x [CentOS7] GNOME 3.x(GNOME Shell) (2)文件系统 [CentOS6] ext4 [CentOS7] xfs (3 ...

  7. js上传整个文件夹

    文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...

  8. 0079 Ehcache 3.x应用入门及通过JCache与Spring整合

    基本要素:版本.概念与抽象 Ehcache 3.x是一个用Java语言实现的缓存库,并且实现了 JSR107规范 Ehcache从2.x升级到3.x后,Maven依赖从 net.sf.ehcache: ...

  9. Pytest学习笔记(三) 在代码中运行pytest

    前面介绍的是在cmd中执行pytest,平常我们一般都是通过编译器(如pycharm)来编写用例的,写完用例后,需要调试看看是否能运行,如果每次都切换到cmd中执行,太麻烦. 因此,这一节来说下怎么在 ...

  10. AT3912 Antennas on Tree

    AT3912 Antennas on Tree %%zzt 只能考虑性质了. 把最后选择的k个点的连通块求出来,连通块内部的点表示都是互异的 连通块外部的点只能形成若干条链,并且这k个点的每一个最多与 ...