原理:

1.画一个正方形,边长为1CM,在此正方形内绘制一个内接圆。
2.假如我们在此正方形内随机点一个点,这个点落在圆内的概率是P
3.假如我们随机足够多的点,那么我们的P就无限接近于Pi/4(=圆的面积/正方形的面积)

表设计:

1.随机落点表(记录随机点的位置)
2.我们以左下角坐标为(0,0)原点坐标
3.生成随机数如下:

java源码:

1.创建point表

package bysql;import com.aliyun.odps.Column;
import com.aliyun.odps.Odps;
import com.aliyun.odps.OdpsType;
import com.aliyun.odps.Table;
import com.aliyun.odps.TableSchema;
import com.aliyun.odps.Tables;public class CreateTable {public static void createTable(Odps odps,String createTableName) throws Exception {Tables tables = odps.tables();// /获取表示ODPS所有Table的集合对象  boolean a = tables.exists(createTableName);// 判断指定表test_table_jyl是否存在if (a) {System.out.println("指定表存在");Table table = tables.get(createTableName);System.out.println("指定表信息为:【name:】" + table.getName() + "【Owner:】"+ table.getOwner());tables.delete(createTableName);} else {System.out.println("指定表不存在");}System.out.println("-------------------------------------------------");/* 创建表 */if (tables.exists(createTableName)) {System.out.println("指定表存在,无法创建");} else {System.out.println("指定表不存在,可以创建");/* TableSchema表示ODPS中表的定义 */TableSchema tableSchema = new TableSchema();/* 添加列 */Column col; // Column表示ODPS中表的列定义col = new Column("x", OdpsType.DOUBLE, "X");tableSchema.addColumn(col);col = new Column("y", OdpsType.DOUBLE, "Y");tableSchema.addColumn(col);tables.create(createTableName, tableSchema);System.out.println("表【" + createTableName + "】创建成功");}System.out.println("-------------------------------------------------");}}

2.随机模拟数据(利用多线程)

package bysql;
import java.io.IOException;
import java.util.Random;
import java.util.concurrent.Callable;
import com.aliyun.odps.data.Record;
import com.aliyun.odps.data.RecordWriter;class UploadThread implements Callable<Boolean> {private long id;private RecordWriter recordWriter;private Record record;static Random random = new Random(System.currentTimeMillis());public UploadThread(long id, RecordWriter recordWriter, Record record) {this.id = id;this.recordWriter = recordWriter;this.record = record;}@Overridepublic Boolean call() throws IOException {for (int m = 0; m < 10000; m++) {//一个线程插入100条record.setDouble("x", getRandomDouble());record.setDouble("y", getRandomDouble());recordWriter.write(record);}recordWriter.close();return true;}private double getRandomDouble() {return random.nextDouble();}
}
package bysql;import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import com.aliyun.odps.Column;
import com.aliyun.odps.Odps;
import com.aliyun.odps.OdpsType;
import com.aliyun.odps.data.ArrayRecord;
import com.aliyun.odps.data.Record;
import com.aliyun.odps.data.RecordWriter;
import com.aliyun.odps.tunnel.TableTunnel;public class InitData {public static void uploadDataToYun(Odps odps, String project, String table)throws Exception {TableTunnel tunnel = new TableTunnel(odps);tunnel.setEndpoint("http://dt.odps.aliyun.com");// 设置TunnelServer地址,没有设置TunnelServer地址的情况下自动选择TableTunnel.UploadSession uploadSession = tunnel.createUploadSession(project, table);//线程数int threadNum = 100;long startTime = System.currentTimeMillis();System.out.println("正在上传数据.............");ExecutorService pool = Executors.newFixedThreadPool(threadNum);ArrayList<Callable<Boolean>> callers = new ArrayList<Callable<Boolean>>();for (int i = 0; i < threadNum; i++) {RecordWriter rw = uploadSession.openRecordWriter(i);Column[] columns = new Column[2];columns[0] = new Column("x", OdpsType.DOUBLE);columns[1] = new Column("y", OdpsType.DOUBLE);Record r = new ArrayRecord(columns);callers.add(new UploadThread(i, rw, r));}pool.invokeAll(callers);pool.shutdown();Long[] blocks = uploadSession.getBlockList();uploadSession.commit(blocks);System.out.println("数据上传完毕!");long endTime = System.currentTimeMillis();System.out.println("总共耗时:" + (endTime - startTime) + " ms");System.out.println("-------------------------------------------------");}
}

3.求圆周率pi

1)执行SQL作业查找在圆内的点的个数A1
 select count(*) from point where ((x-0.5)*((x-0.5))+(y-0.5)*(y-0.5) <=0.5*0.5);
2)执行SQL作业查询所有的点的个数A2
 select count(*) from point ;
3)计算点出现在圆内的概率
 P=A1/A2
4)计算圆周率Pi
 Pi=4P

package bysql;import java.util.Map;
import com.aliyun.odps.Instance;
import com.aliyun.odps.Odps;
import com.aliyun.odps.OdpsException;
import com.aliyun.odps.account.Account;
import com.aliyun.odps.account.AliyunAccount;
import com.aliyun.odps.task.SQLTask;public class GetPI {private static final String ACCESS_ID = "*****************";private static final String ACCESS_KEY = "**********************";private static final String PROJECT_NAME = "****************";private static final String ODPS_URL = "http://service.odps.aliyun.com/api";public static void main(String args[]) throws Exception {/* 先构建阿里云帐号 */Account account = new AliyunAccount(ACCESS_ID, ACCESS_KEY);System.out.println("Account Type:" + account.getType());System.out.println("-------------------------------------------------");/* Odps类是ODPS SDK的入口 */Odps odps = new Odps(account);odps.setDefaultProject(PROJECT_NAME);// 指定默认使用的Project名称odps.setEndpoint(ODPS_URL);// 设置ODPS服务的地址String tableName = "point";/*建表*/CreateTable.createTable(odps,tableName);/*初始化数据*/InitData.uploadDataToYun(odps, PROJECT_NAME, tableName);/*查询总数*/long startTime = System.currentTimeMillis();String sql = "select count(*) from point ;";System.out.println("正在查询当前point总数...");String ret = excuteSql(odps, sql);System.out.println("总数:"+ret);long endTime = System.currentTimeMillis();System.out.println("总共耗时:" + (endTime - startTime) + " ms");System.out.println("-------------------------------------------------");/*查询命中数*/startTime = System.currentTimeMillis();System.out.println("正在查询命中的point总数...");sql = "select count(*) from point where ((x-0.5)*((x-0.5))+(y-0.5)*(y-0.5) <=0.5*0.5);";//最多获取1000条信息。String ret2 = excuteSql(odps, sql);System.out.println("命中数:"+ret2);endTime = System.currentTimeMillis();System.out.println("总共耗时:" + (endTime - startTime) + " ms");System.out.println("-------------------------------------------------");/**/String pi =  calculate(ret, ret2);System.out.println("Pi=" + pi);}/*** 执行SQL*/public static String excuteSql(Odps odps, String sql) throws OdpsException {String ret = "";/*Instance表示ODPS中计算任务的一个运行实例*/Instance instance = null;instance = SQLTask.run(odps, sql);//运行SQLinstance.waitForSuccess();//阻塞当前线程, 直到Instance结束/** 获得Instance中Task的运行结果* Task的运行结果, key为Task的名称,value为Instance.Result .getString()的结果。*/Map<String, String> results = instance.getTaskResults();Map<String, Instance.TaskStatus> taskStatus = instance.getTaskStatus();for (Map.Entry<String, Instance.TaskStatus> status : taskStatus.entrySet()) {String result = results.get(status.getKey());ret += result;}return ret;}/*** 求Pi*/private static String calculate(String ret, String ret2) {if (ret.indexOf("\n") > 0 && (ret2.indexOf("\n") > 0)) {String dataStr[] = ret.split("\n");String dataStr2[] = ret2.split("\n");float pi = (Float.parseFloat(dataStr2[1]) / Float.parseFloat(dataStr[1])) * 4;return String.format("%f", pi);}return null;}}

结果:




【ODPS】利用阿里云ODPS作业进行圆周率Pi的计算相关推荐

  1. python连接阿里云odps

    怎么下载他的库这个就自行百度了,配置完毕之后就用以下代码即可用python连接阿里云odps的数据库了. from odps import ODPS o = ODPS('嘿嘿嘿', #这个地方是阿里云 ...

  2. python学习之路:python连接阿里云ODPS

    python学习之路:python连接阿里云ODPS 前言 本人最近在学习使用ODPS,希望把学习过程记录下来,方便自己查阅. 1.安装ODPS pip install ODPS 2.连接阿里云odp ...

  3. 利用阿里云实现异地容灾的解决方案

    一.异地灾备防范于未然 2001年的"911事件"中,没有远程备份的企业都遭受了巨大损失,甚至部分公司因为核心业务部署在公司大楼而又没有远程备份,导致公司业务无法继续运营而倒闭.美 ...

  4. 利用阿里云容器镜像服务下载gcr.io镜像

    背景 由于你懂的原因,国内是没有办法下载gcr.io镜像的,利用docker hub构建GitHub现在又要钱,所以这里利用阿里云容器镜像服务下载gcr.io镜像. 步骤 这里以gcr.io/tekt ...

  5. 利用阿里云如何开发一款直播app?

    在开发的过程中应该注意些什么?下面让小编告诉你: 随着互联网的发展,越来越多的人已经加入互联网的行列.而且很多的人也开始直播,和众多的网友分享自己身边事情.互联网还在加速发展,从PC互联网,到移动互联 ...

  6. 利用阿里云免费镜像仓库,实现微服务的k8s部署

    今天的内容给大家介绍下如何利用阿里云提供的免费私人容器镜像服务,来实现对个人项目容器镜像的管理,以及通过k8s集群来发布阿里云私人容器镜像服务中管理的服务.本文适合个人及创业团队学习/使用基于容器.镜 ...

  7. 如何利用阿里云赚钱_5种利用云赚钱的策略

    如何利用阿里云赚钱 现在每个人都在电视上听到云计算. 运营商会将您的联系人存储在云中. 托管公司将在云中托管您的网站. 其他人会将您的照片存储在云中. 但是,您如何利用云赚钱? 首先是忘记基础架构和虚 ...

  8. 利用阿里云搭建NFS服务器

    一.阿里云服务器(ECS) Linux是现在计算机运维的主流服务器,正好阿里云服务器也是目前非常主流的云服务器,我就简单地利用阿里云服务器和Linux配置的NFS服务器和客户端.功能非常简单,但这是第 ...

  9. 如何利用阿里云域名远程访问家中群辉NAS(Docker容器)上的calibre、halo博客?

    看前备注:作者也是小白,只是在自己的摸索中积攒了一点经验,分享给大家.不能保证100%的正确,欢迎大家讨论分享. 我的博客(会同步更新的):陌路遥的博客 文作者:陌路遥/欢迎转载 如何利用阿里云域名远 ...

  10. 杜彪:天猫数据如何运营、变现? 利用阿里云聚石塔在双11的成功案例

    本文作者杜彪,毕业于北京大学计算机系,长期从事人工智能,数据技术研究与应用,国际信息研究学会中国分会副秘书长,北京裕兴科技集团高级顾问. 有一次听闻他利用电商数据做精准营销.没听到他的故事之前,我曾粗 ...

最新文章

  1. sd卡 写卡阻塞_Sony a7r4写卡速度测试
  2. mysql集群搭建_mysql高可用集群搭建
  3. 其实没有啥好说的公司组织去清远漂流
  4. Dubbo的负载均衡、集群容错、服务降级等机制详解
  5. c语言中printf输出格式
  6. arm linux 内存压力测试,嵌入式中如何给内存做压力测试?
  7. html+js实现分页功能
  8. 汽车厂自制的流水线边 物料亮灯防错系统
  9. 带你Dart带你Diao之类(一)
  10. 50套电子看板,数据大屏设计,数据展示模板,大屏可视化,大数据分析平台,ui设计模板
  11. 2021CCPC网络预选赛
  12. 加密勒索病毒:诞生、忽视以及爆炸式增长
  13. JavaScript/Js 大全
  14. 祝您健康:抢救脑溢血患者的神奇秘方:针刺十宣穴,涌泉穴
  15. 从RMSE和MSE到更多选择:探索机器学习模型性能指标
  16. understand学习
  17. CEA-861-D infoframe
  18. Java是什么,有什么优势及特点
  19. 计算机外设分为三类,2021年计算机外设包含什么-计算机外设有什么组成.docx
  20. SD卡数据恢复教程:3种工具一键恢复SD卡误删的照片

热门文章

  1. 你知道几种继承方式?(结尾有彩蛋)
  2. 『docker笔记』Centos7离线安装docker[补充CentOS开机自启动脚本/Linux用户组group]
  3. 258.369f的科学记数法手工计算和验证
  4. 《 产品设计思维:电商产品设计全攻略》一一3.5 首页的效益评估体系
  5. 销售管理全面指南:职能、流程、目标和工具
  6. 我国自制研究的什么超级计算机,世界最快超级计算机 探秘天河一号
  7. 剑指offer 介绍一种很骚的做法 求1+2+…+n不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句 (A?B:C)。【简单易懂,代码可以直接运行】
  8. Android 设计模式入门到精通之六:代理模式(Proxy Pattern)
  9. POJ 3592 缩点加spfa
  10. 【优化调度】基于粒子群算法求解分布式能源调度优化问题含Matlab源码