首页 文章 精选 留言 我的

精选列表

搜索[量化交易],共10000篇文章
优秀的个人博客,低调大师

MapReduce对交易日志进行排序的Demo(MR的二次排序)

1.日志源文件 (各个列分别是: 账户,营业额,花费,日期) zhangsan@163.com 6000 0 2014-02-20 lisi@163.com 2000 0 2014-02-20 lisi@163.com 0 100 2014-02-20 zhangsan@163.com 3000 0 2014-02-20 wangwu@126.com 9000 0 2014-02-20 wangwu@126.com 0 200 2014-02-20 想要的结果: (计算出每个账户的总营业额和总花费,要求营业额排序降序,如果营业额相同则花费少的在上面) zhangsan@163.com 9000 0 9000 wangwu@126.com 9000 200 8800 lisi@163.com 2000 100 1900 2.写代码: InfoBean.java 对账户的后三个字段封装成一个Bean对象 1 import java.io.DataInput; 2 import java.io.DataOutput; 3 import java.io.IOException; 4 5 import org.apache.hadoop.io.WritableComparable; 6 7 //要和其他的InfoBean类型进行比较,所以此处泛型T为InfoBean 8 public class InfoBean implements WritableComparable<InfoBean> { 9 10 private String account; 11 private double income; 12 private double expenses; 13 private double surplus; 14 15 /* 16 *如果不写这个方法,封装InfoBean对象的时候就要分别set这个对象的各个属性. 17 */ 18 public void set(String account,double income,double expenses){ 19 this.account = account; 20 this.income = income; 21 this.expenses = expenses; 22 this.surplus = income -expenses; 23 } 24 @Override 25 public void write(DataOutput out) throws IOException { 26 out.writeUTF(account); 27 out.writeDouble(income); 28 out.writeDouble(expenses); 29 out.writeDouble(surplus); 30 } 31 32 @Override 33 public void readFields(DataInput in) throws IOException { 34 this.account = in.readUTF(); 35 this.income = in.readDouble(); 36 this.expenses = in.readDouble(); 37 this.surplus = in.readDouble(); 38 } 39 40 @Override 41 public int compareTo(InfoBean o) { 42 if(this.income == o.getIncome()){ 43 return this.expenses > o.getExpenses() ? 1 : -1; 44 } else { 45 return this.income > o.getIncome() ? -1 : 1; 46 } 47 } 48 49 @Override 50 //toString()方法输出的格式最好和源文件trade_info.txt中的格式一样, 字段通过Tab键分隔. 51 //而且在SumReducer类输出k3,v3的时候会输出k3(context.write(key, v);) 所以这个地方没有必要再输出k3(account) 52 public String toString() { 53 // return "InfoBean [account=" + account + ", income=" + income 54 // + ", expenses=" + expenses + ", surplus=" + surplus + "]"; 55 return this.income + "\t" + this.expenses+"\t" + this.surplus; 56 } 57 public double getIncome() { 58 return income; 59 } 60 61 public void setIncome(double income) { 62 this.income = income; 63 } 64 65 public double getExpenses() { 66 return expenses; 67 } 68 69 public void setExpenses(double expenses) { 70 this.expenses = expenses; 71 } 72 73 public double getSurplus() { 74 return surplus; 75 } 76 77 public void setSurplus(double surplus) { 78 this.surplus = surplus; 79 } 80 81 public String getAccount() { 82 return account; 83 } 84 85 public void setAccount(String account) { 86 this.account = account; 87 } 88 89 } SumStep.java 1 import java.io.IOException; 2 3 import org.apache.hadoop.conf.Configuration; 4 import org.apache.hadoop.fs.Path; 5 import org.apache.hadoop.io.LongWritable; 6 import org.apache.hadoop.io.Text; 7 import org.apache.hadoop.mapreduce.Job; 8 import org.apache.hadoop.mapreduce.Mapper; 9 import org.apache.hadoop.mapreduce.Reducer; 10 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 11 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 12 13 public class SumStep { 14 15 public static class SumMapper extends Mapper<LongWritable, Text, Text, InfoBean>{ 16 private Text k = new Text(); 17 private InfoBean bean = new InfoBean(); 18 19 @Override 20 protected void map(LongWritable key, Text value,Mapper<LongWritable, Text, Text, InfoBean>.Context context) 21 throws IOException, InterruptedException { 22 23 String line = value.toString(); 24 String [] fields = line.split("\t"); 25 String account = fields[0]; 26 double income = Double.parseDouble(fields[1]); 27 double expenses = Double.parseDouble(fields[2]); 28 k.set(account); 29 bean.set(account, income, expenses); 30 context.write(k, bean); 31 } 32 } 33 public static class SumReducer extends Reducer<Text, InfoBean, Text, InfoBean>{ 34 private InfoBean v = new InfoBean(); 35 @Override 36 protected void reduce(Text key, Iterable<InfoBean> values,Reducer<Text, InfoBean, Text, InfoBean>.Context context) 37 throws IOException, InterruptedException { 38 double sum_in = 0; 39 double sum_out = 0; 40 for(InfoBean bean : values){ 41 sum_in += bean.getIncome(); 42 sum_out += bean.getExpenses(); 43 } 44 /* 45 * 在crxy的流量统计的案例中 是如下的方式写出k3和v3的 在reduce方法中new这个封装好的对象. 46 * 但是如果数据量比较大的情况下 是可能会造成内存溢出的. 47 * TrafficWritable v3 = new TrafficWritable(t1, t2, t3, t4); 48 * context.write(k2, v3); 49 * 50 * 所以建议把这个封装的对象写在"脑袋顶上" 如上所示....private InfoBean v = new InfoBean(); 51 * 但是如果你Java基础比较好的话可能会说 在Java中是引用传递...所以后面的v会覆盖前面的v,造成最后只有最有一个v 52 * 其实这里是不会产生问题的,因为context.write()方法会直接把v3对应的InfoBean对象序列化. 53 * 虽然之前对象的引用确实覆盖了,但是之前对象的值等都保存了下来.是可以放在这个类的"脑袋顶上"的. 54 * 让这个类公用这个InfoBean对象. 55 */ 56 57 v.set(key.toString(),sum_in,sum_out); 58 context.write(key, v); 59 } 60 } 61 public static void main(String[] args) throws Exception { 62 Configuration conf = new Configuration(); 63 Job job = Job.getInstance(conf); 64 job.setJarByClass(SumStep.class); 65 66 job.setMapperClass(SumMapper.class); 67 //以下两行可以在满足一定条件的时候省略掉. 68 //在满足k2和k3,v2和v3一一对应的时候就可以省略掉. 看SumReducer类所在行的泛型. 69 job.setMapOutputKeyClass(Text.class); 70 job.setMapOutputValueClass(InfoBean.class); 71 72 FileInputFormat.setInputPaths(job, new Path(args[0])); 73 74 job.setReducerClass(SumReducer.class); 75 job.setOutputKeyClass(Text.class); 76 job.setOutputValueClass(InfoBean.class); 77 FileOutputFormat.setOutputPath(job, new Path(args[1])); 78 job.waitForCompletion(true); 79 } 80 } 项目打成jar包放到Linux中,日志源文件上传到HDFS上.运行结果如下: hadoop jar /root/itcastmr.jar itcastmr.SumStep /user/root/trade_info.txt /tradeout 但是这个结果并没有排序.还是按照账号的字典排序. 以这个MR的输出当做输入对其根据InfoBean对象进行排序..... 上代码SortStep.java: 1 import java.io.IOException; 2 3 import org.apache.hadoop.conf.Configuration; 4 import org.apache.hadoop.fs.Path; 5 import org.apache.hadoop.io.LongWritable; 6 import org.apache.hadoop.io.NullWritable; 7 import org.apache.hadoop.io.Text; 8 import org.apache.hadoop.mapreduce.Job; 9 import org.apache.hadoop.mapreduce.Mapper; 10 import org.apache.hadoop.mapreduce.Reducer; 11 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 12 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 13 14 public class SortStep { 15 //这个Mapper读取的HDFS文件是SumStep Reduce计算输出的文件. 16 public static class SortMapper extends Mapper<LongWritable, Text, InfoBean, NullWritable>{ 17 private InfoBean k = new InfoBean(); 18 @Override 19 protected void map(LongWritable key,Text value,Mapper<LongWritable, Text, InfoBean, NullWritable>.Context context) 20 throws IOException, InterruptedException { 21 String line = value.toString(); 22 String [] fields = line.split("\t"); 23 String account = fields[0]; 24 double income = Double.parseDouble(fields[1]); 25 double expenses = Double.parseDouble(fields[2]); 26 k.set(account, income, expenses); 27 //现在是要求按照InfoBean对象中的规则排序(InfoBean中有compareTo方法)...所以InfoBean对象当做k2... 28 context.write(k,NullWritable.get());//不能传null,NullWritable.get() 是获得的this对象. 29 } 30 } 31 public static class SortReducer extends Reducer<InfoBean, NullWritable, Text, InfoBean>{ 32 private Text k = new Text(); 33 @Override 34 protected void reduce(InfoBean bean, Iterable<NullWritable> values,Reducer<InfoBean, NullWritable, Text, InfoBean>.Context context) 35 throws IOException, InterruptedException { 36 String account = bean.getAccount(); 37 k.set(account); 38 context.write(k, bean); 39 } 40 } 41 42 public static void main(String[] args) throws Exception { 43 Configuration conf = new Configuration(); 44 Job job = Job.getInstance(conf); 45 job.setJarByClass(SortStep.class); 46 47 job.setMapperClass(SortMapper.class); 48 //以下两行可以在满足一定条件的时候省略掉. 49 //在满足k2和k3,v2和v3一一对应的时候就可以省略掉. 看SumReducer类所在行的泛型. 50 job.setMapOutputKeyClass(InfoBean.class); 51 job.setMapOutputValueClass(NullWritable.class); 52 53 FileInputFormat.setInputPaths(job, new Path(args[0])); 54 55 job.setReducerClass(SortReducer.class); 56 job.setOutputKeyClass(Text.class); 57 job.setOutputValueClass(InfoBean.class); 58 FileOutputFormat.setOutputPath(job, new Path(args[1])); 59 job.waitForCompletion(true); 60 } 61 } 打成jar包,然后运行命令....输入为上面SumStep.java的输出 hadoop jar /root/itcastmr.jar itcastmr.SortStep /tradeout /trade_sort_out 排序之后的结果: 在MapReduce读取输入数据的时候,如果这个文件是以下划线开始的话,那么会不会读取这个文件中的内容...."_SUCCESS"文件就不会读取.... 如果想对某个类进行排序, 1.这个类要实现WritableComparable接口, 2.还要重写compareTo方法. 根据自己的业务逻辑自定义排序. 只需要把要排序的类当做k2 就可以了...框架自动排序. 要排序对象的compareTo方法是框架调用的,框架在shuffle这个阶段会调用排序. shuffle后面会讲,shuffle由很多很多的阶段组成,分区,排序,分组,combiner等等...把这些小的细节都讲完了之后再讲shuffle. 本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/7398455.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

谷歌再次指控甲骨文律师透露其与苹果的搜索交易机密

今年1月,一位甲骨文辩护律师曾透露,为了在iPhone手机中继续保留自己的搜索框,谷歌与苹果签订了一份收入分成协议,并于2014年向苹果支付了10亿美元。 谷歌曾试图对这名律师进行指控,但负责该案的美国地方法官William Alsup表示在谷歌与甲骨文Java案接近尾声时才会考虑审理此案。 今天谷歌再次将甲骨文律师告上法庭,指控其违反法庭保护令,透露谷歌与苹果之间的商业机密。 据《财富》报道,谷歌在6月29日提交的一份法庭文件中指出:“由于甲骨文律师透露了一个重要机密商业协议中的条款,谷歌和苹果第三方都将受到伤害。” 在甲骨文状告谷歌侵权使用部分 Java 编程一案上,甲骨文声称谷歌Android侵犯了Java语言的部分版权。然而在5月底法院最终判决谷歌获胜。 据悉,甲骨文表示将支持其辩护律师Annette Hurst,Hurst在一家称为 Orrick的公司工作。 甲骨文在一封发给《财富》的邮件声明中指出,律师“在法庭公开审理口头辩论中提及的内容是对谷歌虚假陈述行为的回应”。 文章转载自 开源中国社区[http://www.oschina.net]

优秀的个人博客,低调大师

海上养殖数字孪生管理平台量化指标与误差控制规范

本指标适用于海上养殖全域海域场景渲染、养殖网架设备动态仿真、水体生态态势推演、海况环境可视化、养殖海域全域-养殖区块-单体设备多级尺度漫游、多路海洋养殖监测数据实时联动全流程性能校验,所有参数基于标准化近海养殖海域、全养殖设备满载运行、全点位海洋传感设备在线接入、1080P分辨率测试环境,为系统最优工程运行参数。

优秀的个人博客,低调大师

weops-lite v1.0 正式发布,轻量化运维平台

一、项目概述 随着信息技术的飞速发展,企业的 IT 基础设施日益复杂,运维管理变得更加重要和具有挑战性。为了帮助企业高效地管理其 IT 资产与运维流程。本项目旨在通过全面的资产管理、强大的凭据管理和快速的全文检索功能,协助运维人员提升工作的效率和准确性。 项目地址:https://gitee.com/weops-lab/weops_lite 二、主要功能 本运维平台项目提供以下主要功能: 1. 资产管理 资产管理是本平台的核心功能之一,运维人员可以对企业的各类 IT 资产进行全面的管理。包括但不限于: 资产创建与管理:支持增删改查操作,实现对物理服务器、虚拟化资源、存储设备等的全面管理。 模型创建:支持根据不同资产类型自定义模型,灵活适应多种企业资产管理需求。 2. 凭据管理 凭据管理功能旨在帮助运维人员安全地管理各类凭证和认证信息。其主要特性包括: 凭据存储:支持各类凭据的加密存储,确保凭证安全。 凭据共享:支持将凭据在团队内部安全共享,提升团队协同工作效率。 3. 全文检索 平台集成了强大的全文检索功能,允许用户快速查找所需信息。特性如下: 快速检索:支持关键字检索,运维人员可以快速找到相关的资产信息。 高效索引:采用高效的索引机制,保证大数据量下的检索速度。 4. 系统管理 系统管理模块为平台的稳定运行提供了保障,主要包括: 系统配置:支持对平台各项配置参数进行灵活设置。 日志管理:详细记录系统运行日志,方便排查故障。 权限分配:为不同角色分配不同权限,确保用户只能访问其所需的功能模块。 用户创建与管理:支持用户增删改查操作。 用户组管理:支持将用户分组管理,便于权限统一设置。 三、技术架构 本开源运维平台项目基于 Python 语言开发,主要采用 Django 和 Django REST Framework(DRF)进行开发和维护。为了确保项目结构的清晰和模块化,采用了一种分层设计思想,将不同的功能和逻辑分散在不同的模块中。 四、安装与使用 详见网址:https://gitee.com/weops-lab/weops_lite 五、总结 本开源运维平台项目通过完善的资产管理、强大的凭据管理和高效的全文检索功能,助力企业提升 IT 运维管理效率。项目基于 Python 开发,具备良好的稳定性和可扩展性,适合各类企业的运维需求。希望本项目能对各位运维人员有所帮助,欢迎大家参与贡献和交流。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册