mapreduce案例:获取PI的值
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的值的更多相关文章
- Mapreduce案例之Pi值估算
题目: 这个程序的原理是这样的.假如有一个边长为1的正方形.以正方形的一个端点为圆心,以1为半径,画一个圆弧,于是在正方形内就有了一个直角扇形.在正方形里随机生成若干的点,则有些点是在扇形内,有些点是 ...
- 获取字段唯一值工具- -ArcPy和Python案例学习笔记
获取字段唯一值工具- -ArcPy和Python案例学习笔记 目的:获取某一字段的唯一值,可以作为工具使用,也可以作为函数调用 联系方式:谢老师,135-4855-4328,xiexiaokui# ...
- 【Hadoop离线基础总结】MapReduce案例之自定义groupingComparator
MapReduce案例之自定义groupingComparator 求取Top 1的数据 需求 求出每一个订单中成交金额最大的一笔交易 订单id 商品id 成交金额 Order_0000005 Pdt ...
- MVC教程二:从控制器中获取URL的值
一.从控制器中获取URL的值有三种方式: 1.使用Request.QueryString[] 例如: string value = Request.QueryString["BookId&q ...
- JQ获取元素属性值
最近在学习JAVA Web,自己也是做个下列表左右选择的小案例. 获取某个元素的属性值一直以为是要调用atrr方法,不过好像获取元素的数组形式再遍历每个元素的时候想获取到它的属性值用attr方法有问题 ...
- jquery 获取css3 transform 值
最近写了个旋转,有要求获取transform值.当看到console.log($("#id").css("transform"))的值的时候,我的内心是崩溃的 ...
- grails项目获取前后台的值
grails项目中前台传值给后台: 加入我有a.gsp这个页面,a.gsp中有如下代码: 姓名:<input type="text" name="xing" ...
- C#获取存储过程返回值和输出参数值的方法
//转自网络,先留个底 1.获取Return返回值 //存储过程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @ ...
- 在java中获取attr的值
首先说如何获取已经在style里面定义好的attr的值,以colorPrimary为例: TypedValue value = new TypedValue(); mContext.getTheme( ...
随机推荐
- SpringDataJpa 分页查询
第一种方式 实体类 Student import javax.persistence.*; import java.io.Serializable; @Entity @Table(name=" ...
- BZOJ 4802: 欧拉函数 (Pollard-Rho)
开始一直T,原来是没有srand- CODE #include<bits/stdc++.h> using namespace std; typedef long long LL; vect ...
- HDU 6036 - Division Game | 2017 Multi-University Training Contest 1
/* HDU 6036 - Division Game [ 组合数学,NTT ] | 2017 Multi-University Training Contest 1 题意: k堆石子围成一个圈,数量 ...
- 多个idea项目使用同一个tomcat
配置好tomcat后,每个项目使用不同的虚拟路径.并且把tomcat端口改为不一样的就可以了.
- 关于单片机特殊功能寄存器(SFR)和内存(RAM)公用地址:80-FF 如何区分
RAM 的 80-FF 需要间接寻址进行访问 如: MOV R0,#80H; MOV A,@R0 ; (内存 80H地址内的数据放到A中) SFR的80-FF需要直接寻址进行访问如: MOV ...
- Java数据库小项目00---基础知识
目录 JDBC的简单使用 向JDBC注入攻击 防止注入攻击 自建JDBC工具类 自建工具类优化--使用配置文件 使用数据库连接池优化工具类 JDBC的简单使用 package Test; import ...
- Xilinx的IP核接口命名说明
s_axis中的s表示:slave(从); m_axis中的m表示:master(主). axis表示AXI(一种总线协议) Signal.
- linux技巧----查找某个正在执行的脚本
如果在机器上发现有执行的脚本,却不知道在哪,可以这样找 例如 # netstat -ltnp Active Internet connections (only servers) Proto Recv ...
- Kettle环境的安装
Kettle是绿色免安装的,下载完解压之后找到Spoon.bat,直接执行就好 欢迎界面 Kettle主要分为转换和作业2类 新建一个转换demo 创建了一个转换demo后,由于是数据抽取,因此我们抽 ...
- centos7下面改变亮度
通过改自己的配置文件来改变亮度的方法在我的机器上面是不中用了,我的是台式机,我用的集成显卡,目前我找到的还勉强的方法就是通过安装redshift来改变屏幕的亮度,我就是不喜欢太亮,差点瞎了. 具体是这 ...