导航:首页 > 炒股攻略 > mapreduce分析股票

mapreduce分析股票

发布时间:2021-03-16 07:41:27

⑴ maprece怎么对特定字段进行分析

理文本是 MapRece 流程的一种常见用法,因为文本处理相对复杂且是处理器资源密集的处理。基本的字数统计常常用于演示 Haddoop 处理大量文本和基本汇总大体内容的能力。
要获得字数,将文本从一个输入文件中拆分(使用一个基本的 string tokenizer)为各个包含计数的单词,并使用一个 Rece 来计算每个单词的数量。例如,从短语 the quick brown fox jumps over the lazy dog 中,Map 阶段生成清单 1 中的输出。

⑵ maprece模型适合哪些环境

离线处理数据量很大的数据,但是不要指望他快的哪里去,用他你只要知道你会有结果,中间就慢慢等吧。。。环境有很多,广告投放的,推荐系统的,分析用户行为的,金融行业,(比如我面试的一家银行,他们就是做信用卡客户资料存储分析的),还有电信行业,还有公安机关,用途是很多滴

⑶ maprece为什么不适合处理小文件

1. 不适合事务/单一请求处理
MapRece绝对是一个离线批处理系统,对于批处理数据应用得很好:MapRece(不论是Google的还是Hadoop的)是用于处理不适合传统数据库的海量数据的理想技术。但它又不适合事务/单一请求处理。(HBase使用了来自Hadoop核心的HDFS,在其常用操作中并没有使用MapRece。)

2. 不能随即读取

3. 以蛮力代替索引
在索引是更好的存取机制时,MapRece将劣势尽显。

4. low-level语言和操作
“直接开始你想要的 -- 而不是展示一个算法,解释如何工作的。” (关系型数据库的观点) -- High level(DBMS)
“展示数据存取的算法。” (Codasyl 的观点) -- Low level(MapRece)
5. 性能问题
想想N个map实例产生M个输出文件-每个最后由不同的rece 实例处理, 这些文件写到运行map实例机器的本地硬盘. 如果N是1,000, M是500, map阶段产生500,000个本地文件. 当rece阶段开始, 500个rece实例每个需要读入1,000文件,并用类似FTP协议把它要的输入文件从map实例运行的节点上pull取过来. 假如同时有数量级为100的rece实例运行, 那么2个或2个以上的rece实例同时访问同一个map节点来获取输入文件是不可避免的-导致大量的硬盘查找, 有效的硬盘运转速度至少降低20%. 这就是为什么并行数据库系统不实现split文件, 采用push(推到socket套接字)而不是pull. 由于MapRece的出色容错依赖于如何实现split文件, MapRece框架是否成功地转向使用push范式, 不是很清楚.

6. 仅提供了现代DBMS功能的一小部分
作为用于分布式处理的算法技术,MapRece不是数据库,不支持索引、数据更新、事务及完整性约束等,且与多数DBMS工具不兼容。

7. 不适合一般web应用
大部分web应用,只是对数据进行简单的访问,每次请求处理所耗费的资源其实非常小,它的问题是高并发,所以要采用负载均衡技术来分担负载。只有当特殊情况下,比如建索引,进行数据分析等,才可能用MR。

⑷ 什么是MapRece

概念"Map(映射)"和"Rece(化简)",和他们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。他极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Rece(化简)函数,用来保证所有映射的键值对中的每一个共享相同的键组。 映射和化简 简单说来,一个映射函数就是对一些独立元素组成的概念上的列表(例如,一个测试成绩的列表)的每一个元素进行指定的操作(比如前面的例子里,有人发现所有学生的成绩都被高估了一分,他可以定义一个“减一”的映射函数,用来修正这个错误。)。 事实上,每个元素都是被独立操作的,而原始列表没有被更改,因为这里创建了一个新的列表来保存新的答案。这就是说,Map操作是可以高度并行的,这对高性能要求的应用以及并行计算领域的需求非常有用。 而化简操作指的是对一个列表的元素进行适当的合并(继续看前面的例子,如果有人想知道班级的平均分该怎么做?他可以定义一个化简函数,通过让列表中的元素跟自己的相邻的元素相加的方式把列表减半,如此递归运算直到列表只剩下一个元素,然后用这个元素除以人数,就得到了平均分。)。虽然他不如映射函数那么并行,但是因为化简总是有一个简单的答案,大规模的运算相对独立,所以化简函数在高度并行环境下也很有用。编辑本段分布和可靠性 MapRece通过把对数据集的大规模操作分发给网络上的每个节点实现可靠性;每个节点会周期性的把完成的工作和状态的更新报告回来。如果一个节点保持沉默超过一个预设的时间间隔,主节点(类同Google File System中的主服务器)记录下这个节点状态为死亡,并把分配给这个节点的数据发到别的节点。每个操作使用命名文件的原子操作以确保不会发生并行线程间的冲突;当文件被改名的时候,系统可能会把他们复制到任务名以外的另一个名字上去。(避免副作用)。 化简操作工作方式很类似,但是由于化简操作在并行能力较差,主节点会尽量把化简操作调度在一个节点上,或者离需要操作的数据尽可能近的节点上了;这个特性可以满足Google的需求,因为他们有足够的带宽,他们的内部网络没有那么多的机器。 用途在Google,MapRece用在非常广泛的应用程序中,包括“分布grep,分布排序,web连接图反转,每台机器的词矢量,web访问日志分析,反向索引构建,文档聚类,机器学习,基于统计的机器翻译...”值得注意的是,MapRece实现以后,它被用来重新生成Google的整个索引,并取代老的ad hoc程序去更新索引。 MapRece会生成大量的临时文件,为了提高效率,它利用Google文件系统来管理和访问这些文件。

⑸ Hadoop MapRece中把分析数据写入mysql中

你的job类并没有设置outputformat,如需要输出到数据库,需要特定的输出如下:

job.setJarByClass(TextCheckerJob.class);
job.setMapperClass(TextMapper.class);
job.setRecerClass(TextRece.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(MysqlDBOutputFormat.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setNumReceTasks(1);
MysqlDBOutputFormat.setOutput(job,"data_chck_result",newString[]{"tblName","colName","wrongValue","count"});

同时,job初始化之前,你需要把连接数据库的信息写入conf中,如下

conf.set("maprece.jdbc.driver.class",clazz);
conf.set("maprece.jdbc.username",username);
conf.set("maprece.jdbc.password",password);
conf.set("maprece.jdbc.url",url);

上面的MysqlDBOutputFormat类是我自己重写了,你可以直接使用DBOutputFormat这个类

⑹ 如何用亚马逊弹性MapRece分析大数据

首先,打开Amazon Elastic MapRece控制台。然后点击 Create Cluster ,在五个步骤中完成配置设置。

第一步,配置一个集群

在 Cluster name 字段中,输入一个描述性的名称。它可以是非唯一的。

在Termination protection 字段中,其默认值为Yes。这一设置可确保集群不会因为意外或错误而关闭。

在Logging 字段中,其默认值为Enabled。日志数据将被发送至亚马逊S3。

在Log folder S3 location 字段中,请以如下格式输入存储桶名称和文件夹信息:s3://<bucket name>/<folder>/。

在Debugging 字段中,其默认值为Enabled。

Tag 部分是可选的。你可以为你的EMR集群添加最多10个标签。在一个标签中,包括了一个区分大小写的键值对。

第二步,设置软件配置

在Hadoop distribution 多选框中,选择Amazon 为默认值。

在 AMI version 多选框中,选择 2.4.2 (Hadoop 1.0.3)

在Application to be installed 多选框中,保留选中Hive 和 deletePig。

第三步,设置硬件配置

在 Network 字段中,选择Launch into EC-2 Classic。

在EC2 Subnet 字段中,选择 No preference。

在Master、Core 以及 Task 字段中,默认EC2实例类型为m1.small。对于低工作负载的应用,你可以为所有节点选择使用小实例(可确保降低你的使用成本)。相应地,Count
的默认值分别为1、 2、 0。同时,对于所有三个字段,确保不选中 Request Spot Instances 。

注意:20是每个AWS帐户的最大节点数。如果你运行了2个集群,那么2个集群运行的节点总数必须为20或以下。如果你确实需要节点数超过20,那么你必须提交一个请求以便于提高你的亚马逊EC2实例上限。

第四步,设置安全和访问配置

在EC2 key pair 字段中,从列表中选择一个亚马逊EC2密钥对。这一设置可以让你使用Secure Shell(SSH)来连接主节点。

在IAM user access 字段中,其默认值为 No other IAM users。

在EC2 role 多选框中,其默认值为 no roles found。

在Bootstrap Actions 部分,你可以不做任何操作。

第五步,指定集群参数

在Steps 部分,从列表中选择Hive Program,并点击 Configure and add。

在Name 字段中,其默认值为Hive Program。

在 Script s3 Location 字段中(必选项),以BucketName/path/ScriptName的格式输入相关信息,例如
s3n://elasticmaprece/samples/hive-ads/libs/model-build。

在 Input s3 Location 字段中(可选项),以BucketName/path的格式输入相关信息,例如
s3n://elasticmaprece/samples/hive-ads/tables。该输入值会作为名为INPUT的参数发送给Hive脚
本程序。

Output S3 Location 字段(可选项),以BucketName/path的格式输入相关信息,例如
s3n://myawsbucket/hive-ads/output/2014-4-14。该输入值会作为名为OUTPUT的参数发送给Hive脚本程
序。

在 Arguments 字段,输入相关信息,如 - d LIBS=s3n://elasticrecemap/samples/hive-ads/libs。HIVE脚本程序需要额外的库。

在 Action on Failure 字段中,选择 Continue。如果当前步骤失败,它将继续至下一个步骤。

当你完成后,点击Add,然后点击Create Cluster。你将会看到Summary 信息。

如上例,在你继续查询操作和分析大数据前,你需要在主节点上准备一个HIVE会话。

你将需要每隔五分钟向亚马逊S3推送 Impression 和 Click Log Files。每次添加一个条目,就会向客户显示一条广告。每次添加一个Click
Log Files的条目,客户一条广告。类似于SQL的查询操作简化了关联客户点击数据和特定广告的过程。

总之,分析大数据的最佳方法就是在Hadoop上运行Hive,并使用SQL查询以简化日志数据分析。

⑺ 如何简单解释 MapRece 算法

在Hackbright做导师期间,我被要求向技术背景有限的学生解释MapRece算法,于是我想出了一个有趣的例子,用以阐释它是如何工作的.
例子
你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃.
MapRece方法则是:
给在座的所有玩家中分配这摞牌
让每个玩家数自己手中的牌有几张是黑桃,然后把这个数目汇报给你
你把所有玩家告诉你的数字加起来,得到最后的结论
背景
谷歌在2004年发表了可以分析大量数据的MapRece算法.每当你听到“大数据”这个词时,它指的是因为太大而让仅仅一台机器难以有效存储或分析的问题.MapRece通过把计算量分配给不同的计算机群,能够解决大部分和大数据有关的分析问题.Hadoop提供了最受欢迎的利用MapRece算法来管理大数据的开源方式.现今MapRece是主流.
所以通常来说,每当你听到“大数据”,那也许意味着Hadoop被用来存储数据,也通常意味着数据的抽取和检索是用的MapRece.
拆分
MapRece合并了两种经典函数:
映射(Mapping)对集合里的每个目标应用同一个操作.即,如果你想把表单里每个单元格乘以二,那么把这个函数单独地应用在每个单元格上的操作就属于mapping.
化简(Recing )遍历集合中的元素来返回一个综合的结果.即,输出表单里一列数字的和这个任务属于recing.
重新审视上面的例子
重新审视我们原来那个分散纸牌的例子,我们有MapRece数据分析的基本方法.友情提示:这不是个严谨的例子.在这个例子里,人代表计算机,因为他们同时工作,所以他们是个集群.在大多数实际应用中,我们假设数据已经在每台计算机上了
– 也就是说把牌分发出去并不是MapRece的一步.(事实上,在计算机集群中如何存储文件是Hadoop的真正核心.)
通过把牌分给多个玩家并且让他们各自数数,你就在并行执行运算,因为每个玩家都在同时计数.这同时把这项工作变成了分布式的,因为多个不同的人在解决同一个问题的过程中并不需要知道他们的邻居在干什么.
通过告诉每个人去数数,你对一项检查每张牌的任务进行了映射. 你不会让他们把黑桃牌递给你,而是让他们把你想要的东西化简为一个数字.
另外一个有意思的情况是牌分配得有多均匀.MapRece假设数据是洗过的(shuffled)-
如果所有黑桃都分到了一个人手上,那他数牌的过程可能比其他人要慢很多.
如果有足够的人的话,问一些更有趣的问题就相当简单了 -
比如“一摞牌的平均值(二十一点算法)是什么”.你可以通过合并“所有牌的值的和是什么”及“我们有多少张牌”这两个问题来得到答案.用这个和除以牌的张数就得到了平均值.
结论
MapRece算法的机制要远比这复杂得多,但是主体思想是一致的 –
通过分散计算来分析大量数据.无论是Facebook、NASA,还是小创业公司,MapRece都是目前分析互联网级别数据的主流方法.有趣的是,MapRece在多于10PB数据时趋向于变慢,所以谷歌在他们今年的IO大会上报告称MapRece已经不够他们用了,请参见这篇资讯《谷歌弃用
MapRece, 推出替代品 Cloud Dataflow》.

⑻ MapRece是什么有什么作用

MapRece是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念"Map(映射)"和"Rece(归约)",和它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Rece(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
瑭锦TANJURD总结在Google,MapRece用在非常广泛的应用程序中,包括“分布grep,分布排序,web连接图反转,每台机器的词矢量,web访问日志分析,反向索引构建,文档聚类,机器学习,基于统计的机器翻译...”值得注意的是,MapRece实现以后,它被用来重新生成Google的整个索引,并取代老的ad hoc程序去更新索引。

⑼ MapRece和Hadoop有什么区别分别有哪些优缺点

(1)Hadoop
是一个开源的框架,可编写和运行分布式应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式。
Hadoop=HDFS(文件系统,数据存储技术相关)+
Maprece(数据处理),Hadoop的数据来源可以是任何形式,在处理半结构化和非结构化数据上与关系型数据库相比有更好的性能,具有更灵活的
处理能力,不管任何数据形式最终会转化为key/value,key/value是基本数据单元。用函数式变成Maprece代替SQL,SQL是查
询语句,而Maprece则是使用脚本和代码,而对于适用于关系型数据库,习惯SQL的Hadoop有开源工具hive代替。

(2)Hadoop就是一个分布式计算的解决方案.

⑽ hadoop的maprece常见算法案例有几种

基本MapRece模式

计数与求和
问题陈述:
有许多文档,每个文档都有一些字段组成。需要计算出每个字段在所有文档中的出现次数或者这些字段的其他什么统计值。例如,给定一个log文件,其中的每条记录都包含一个响应时间,需要计算出平均响应时间。
解决方案:
让我们先从简单的例子入手。在下面的代码片段里,Mapper每遇到指定词就把频次记1,Recer一个个遍历这些词的集合然后把他们的频次加和。

1 class Mapper
2 method Map(docid id, doc d)
3 for all term t in doc d do
4 Emit(term t, count 1)
5
6 class Recer
7 method Rece(term t, counts [c1, c2,...])
8 sum = 0
9 for all count c in [c1, c2,...] do
10 sum = sum + c
11 Emit(term t, count sum)

这种方法的缺点显而易见,Mapper提交了太多无意义的计数。它完全可以通过先对每个文档中的词进行计数从而减少传递给Recer的数据量:

1 class Mapper
2 method Map(docid id, doc d)
3 H = new AssociativeArray
4 for all term t in doc d do
5 H{t} = H{t} + 1
6 for all term t in H do
7 Emit(term t, count H{t})

如果要累计计数的的不只是单个文档中的内容,还包括了一个Mapper节点处理的所有文档,那就要用到Combiner了:

1 class Mapper
2 method Map(docid id, doc d)
3 for all term t in doc d do
4 Emit(term t, count 1)
5
6 class Combiner
7 method Combine(term t, [c1, c2,...])
8 sum = 0
9 for all count c in [c1, c2,...] do
10 sum = sum + c
11 Emit(term t, count sum)
12
13 class Recer
14 method Rece(term t, counts [c1, c2,...])
15 sum = 0
16 for all count c in [c1, c2,...] do
17 sum = sum + c
18 Emit(term t, count sum)

应用:Log 分析, 数据查询

整理归类

问题陈述:
有一系列条目,每个条目都有几个属性,要把具有同一属性值的条目都保存在一个文件里,或者把条目按照属性值分组。 最典型的应用是倒排索引。
解决方案:
解决方案很简单。 在 Mapper 中以每个条目的所需属性值作为 key,其本身作为值传递给 Recer。 Recer 取得按照属性值分组的条目,然后可以处理或者保存。如果是在构建倒排索引,那么 每个条目相当于一个词而属性值就是词所在的文档ID。
应用:倒排索引, ETL
过滤 (文本查找),解析和校验
问题陈述:
假设有很多条记录,需要从其中找出满足某个条件的所有记录,或者将每条记录传换成另外一种形式(转换操作相对于各条记录独立,即对一条记录的操作与其他记录无关)。像文本解析、特定值抽取、格式转换等都属于后一种用例。
解决方案:
非常简单,在Mapper 里逐条进行操作,输出需要的值或转换后的形式。
应用:日志分析,数据查询,ETL,数据校验

分布式任务执行

问题陈述:
大型计算可以分解为多个部分分别进行然后合并各个计算的结果以获得最终结果。
解决方案: 将数据切分成多份作为每个 Mapper 的输入,每个Mapper处理一份数据,执行同样的运算,产生结果,Recer把多个Mapper的结果组合成一个。
案例研究: 数字通信系统模拟
像 WiMAX 这样的数字通信模拟软件通过系统模型来传输大量的随机数据,然后计算传输中的错误几率。 每个 Mapper 处理样本 1/N 的数据,计算出这部分数据的错误率,然后在 Recer 里计算平均错误率。
应用:工程模拟,数字分析,性能测试
排序
问题陈述:
有许多条记录,需要按照某种规则将所有记录排序或是按照顺序来处理记录。
解决方案: 简单排序很好办 – Mappers 将待排序的属性值为键,整条记录为值输出。 不过实际应用中的排序要更加巧妙一点, 这就是它之所以被称为MapRece 核心的原因(“核心”是说排序?因为证明Hadoop计算能力的实验是大数据排序?还是说Hadoop的处理过程中对key排序的环节?)。在实践中,常用组合键来实现二次排序和分组。
MapRece 最初只能够对键排序, 但是也有技术利用可以利用Hadoop 的特性来实现按值排序。想了解的话可以看这篇博客。
按照BigTable的概念,使用 MapRece来对最初数据而非中间数据排序,也即保持数据的有序状态更有好处,必须注意这一点。换句话说,在数据插入时排序一次要比在每次查询数据的时候排序更高效。
应用:ETL,数据分析

非基本 MapRece 模式

迭代消息传递 (图处理)

问题陈述:
假设一个实体网络,实体之间存在着关系。 需要按照与它比邻的其他实体的属性计算出一个状态。这个状态可以表现为它和其它节点之间的距离, 存在特定属性的邻接点的迹象, 邻域密度特征等等。
解决方案:
网络存储为系列节点的结合,每个节点包含有其所有邻接点ID的列表。按照这个概念,MapRece 迭代进行,每次迭代中每个节点都发消息给它的邻接点。邻接点根据接收到的信息更新自己的状态。当满足了某些条件的时候迭代停止,如达到了最大迭代次数(网络半径)或两次连续的迭代几乎没有状态改变。从技术上来看,Mapper 以每个邻接点的ID为键发出信息,所有的信息都会按照接受节点分组,recer 就能够重算各节点的状态然后更新那些状态改变了的节点。下面展示了这个算法:

1 class Mapper
2 method Map(id n, object N)
3 Emit(id n, object N)
4 for all id m in N.OutgoingRelations do
5 Emit(id m, message getMessage(N))
6
7 class Recer
8 method Rece(id m, [s1, s2,...])
9 M = null
10 messages = []
11 for all s in [s1, s2,...] do
12 if IsObject(s) then
13 M = s
14 else // s is a message
15 messages.add(s)
16 M.State = calculateState(messages)
17 Emit(id m, item M)

一个节点的状态可以迅速的沿着网络传全网,那些被感染了的节点又去感染它们的邻居,整个过程就像下面的图示一样:

案例研究: 沿分类树的有效性传递
问题陈述:
这个问题来自于真实的电子商务应用。将各种货物分类,这些类别可以组成一个树形结构,比较大的分类(像男人、女人、儿童)可以再分出小分类(像男裤或女装),直到不能再分为止(像男式蓝色牛仔裤)。这些不能再分的基层类别可以是有效(这个类别包含有货品)或者已无效的(没有属于这个分类的货品)。如果一个分类至少含有一个有效的子分类那么认为这个分类也是有效的。我们需要在已知一些基层分类有效的情况下找出分类树上所有有效的分类。
解决方案:
这个问题可以用上一节提到的框架来解决。我们咋下面定义了名为 getMessage和 calculateState 的方法:

1 class N
2 State in {True = 2, False = 1, null = 0},
3 initialized 1 or 2 for end-of-line categories, 0 otherwise
4 method getMessage(object N)
5 return N.State
6 method calculateState(state s, data [d1, d2,...])
7 return max( [d1, d2,...] )

案例研究:广度优先搜索
问题陈述:需要计算出一个图结构中某一个节点到其它所有节点的距离。
解决方案: Source源节点给所有邻接点发出值为0的信号,邻接点把收到的信号再转发给自己的邻接点,每转发一次就对信号值加1:

1 class N
2 State is distance,
3 initialized 0 for source node, INFINITY for all other nodes
4 method getMessage(N)
5 return N.State + 1
6 method calculateState(state s, data [d1, d2,...])
7 min( [d1, d2,...] )

案例研究:网页排名和 Mapper 端数据聚合
这个算法由Google提出,使用权威的PageRank算法,通过连接到一个网页的其他网页来计算网页的相关性。真实算法是相当复杂的,但是核心思想是权重可以传播,也即通过一个节点的各联接节点的权重的均值来计算节点自身的权重。

1 class N
2 State is PageRank
3 method getMessage(object N)
4 return N.State / N.OutgoingRelations.size()
5 method calculateState(state s, data [d1, d2,...])
6 return ( sum([d1, d2,...]) )

要指出的是上面用一个数值来作为评分实际上是一种简化,在实际情况下,我们需要在Mapper端来进行聚合计算得出这个值。下面的代码片段展示了这个改变后的逻辑 (针对于 PageRank 算法):

1 class Mapper
2 method Initialize
3 H = new AssociativeArray
4 method Map(id n, object N)
5 p = N.PageRank / N.OutgoingRelations.size()
6 Emit(id n, object N)
7 for all id m in N.OutgoingRelations do
8 H{m} = H{m} + p
9 method Close
10 for all id n in H do
11 Emit(id n, value H{n})
12
13 class Recer
14 method Rece(id m, [s1, s2,...])
15 M = null
16 p = 0
17 for all s in [s1, s2,...] do
18 if IsObject(s) then
19 M = s
20 else
21 p = p + s
22 M.PageRank = p
23 Emit(id m, item M)

应用:图分析,网页索引

值去重 (对唯一项计数)
问题陈述: 记录包含值域F和值域 G,要分别统计相同G值的记录中不同的F值的数目 (相当于按照 G分组).
这个问题可以推而广之应用于分面搜索(某些电子商务网站称之为Narrow Search)
Record 1: F=1, G={a, b}
Record 2: F=2, G={a, d, e}
Record 3: F=1, G={b}
Record 4: F=3, G={a, b}

Result:
a -> 3 // F=1, F=2, F=3
b -> 2 // F=1, F=3
d -> 1 // F=2
e -> 1 // F=2

解决方案 I:
第一种方法是分两个阶段来解决这个问题。第一阶段在Mapper中使用F和G组成一个复合值对,然后在Recer中输出每个值对,目的是为了保证F值的唯一性。在第二阶段,再将值对按照G值来分组计算每组中的条目数。
第一阶段:

1 class Mapper
2 method Map(null, record [value f, categories [g1, g2,...]])
3 for all category g in [g1, g2,...]
4 Emit(record [g, f], count 1)
5
6 class Recer
7 method Rece(record [g, f], counts [n1, n2, ...])
8 Emit(record [g, f], null )

第二阶段:

1 class Mapper
2 method Map(record [f, g], null)
3 Emit(value g, count 1)
4
5 class Recer
6 method Rece(value g, counts [n1, n2,...])
7 Emit(value g, sum( [n1, n2,...] ) )

解决方案 II:
第二种方法只需要一次MapRece 即可实现,但扩展性不强。算法很简单-Mapper 输出值和分类,在Recer里为每个值对应的分类去重然后给每个所属的分类计数加1,最后再在Recer结束后将所有计数加和。这种方法适用于只有有限个分类,而且拥有相同F值的记录不是很多的情况。例如网络日志处理和用户分类,用户的总数很多,但是每个用户的事件是有限的,以此分类得到的类别也是有限的。值得一提的是在这种模式下可以在数据传输到Recer之前使用Combiner来去除分类的重复值。

1 class Mapper
2 method Map(null, record [value f, categories [g1, g2,...] )
3 for all category g in [g1, g2,...]
4 Emit(value f, category g)
5
6 class Recer
7 method Initialize
8 H = new AssociativeArray : category -> count
9 method Rece(value f, categories [g1, g2,...])
10 [g1', g2',..] = ExcludeDuplicates( [g1, g2,..] )
11 for all category g in [g1', g2',...]
12 H{g} = H{g} + 1
13 method Close
14 for all category g in H do
15 Emit(category g, count H{g})

应用:日志分析,用户计数
互相关
问题陈述:有多个各由若干项构成的组,计算项两两共同出现于一个组中的次数。假如项数是N,那么应该计算N*N。
这种情况常见于文本分析(条目是单词而元组是句子),市场分析(购买了此物的客户还可能购买什么)。如果N*N小到可以容纳于一台机器的内存,实现起来就比较简单了。
配对法
第一种方法是在Mapper中给所有条目配对,然后在Recer中将同一条目对的计数加和。但这种做法也有缺点:
使用 combiners 带来的的好处有限,因为很可能所有项对都是唯一的
不能有效利用内存

1 class Mapper
2 method Map(null, items [i1, i2,...] )
3 for all item i in [i1, i2,...]
4 for all item j in [i1, i2,...]
5 Emit(pair [i j], count 1)
6
7 class Recer
8 method Rece(pair [i j], counts [c1, c2,...])
9 s = sum([c1, c2,...])
10 Emit(pair[i j], count s)

Stripes Approach(条方法?不知道这个名字怎么理解)
第二种方法是将数据按照pair中的第一项来分组,并维护一个关联数组,数组中存储的是所有关联项的计数。The second approach is to group data by the first item in pair and maintain an associative array (“stripe”) where counters for all adjacent items are accumulated. Recer receives all stripes for leading item i, merges them, and emits the same result as in the Pairs approach.
中间结果的键数量相对较少,因此减少了排序消耗。
可以有效利用 combiners。
可在内存中执行,不过如果没有正确执行的话也会带来问题。
实现起来比较复杂。
一般来说, “stripes” 比 “pairs” 更快

1 class Mapper
2 method Map(null, items [i1, i2,...] )
3 for all item i in [i1, i2,...]
4 H = new AssociativeArray : item -> counter
5 for all item j in [i1, i2,...]
6 H{j} = H{j} + 1
7 Emit(item i, stripe H)
8
9 class Recer
10 method Rece(item i, stripes [H1, H2,...])
11 H = new AssociativeArray : item -> counter
12 H = merge-sum( [H1, H2,...] )
13 for all item j in H.keys()
14 Emit(pair [i j], H{j})

应用:文本分析,市场分析
参考资料:Lin J. Dyer C. Hirst G. Data Intensive Processing MapRece
用MapRece 表达关系模式
在这部分我们会讨论一下怎么使用MapRece来进行主要的关系操作。
筛选(Selection)

1 class Mapper
2 method Map(rowkey key, tuple t)
3 if t satisfies the predicate
4 Emit(tuple t, null)

投影(Projection)
投影只比筛选稍微复杂一点,在这种情况下我们可以用Recer来消除可能的重复值。

1 class Mapper
2 method Map(rowkey key, tuple t)
3 tuple g = project(t) // extract required fields to tuple g
4 Emit(tuple g, null)
5
6 class Recer

阅读全文

与mapreduce分析股票相关的资料

热点内容
中国银行货币收藏理财上下班时间 浏览:442
中国医药卫生事业发展基金会公司 浏览:520
公司分红股票会涨吗 浏览:778
基金定投的定投规模品种 浏览:950
跨地经营的金融公司管理制度 浏览:343
民生银行理财产品属于基金吗 浏览:671
开间金融公司 浏览:482
基金从业资格科目一的章节 浏览:207
货币基金可以每日查看收益率 浏览:590
投资几个基金合适 浏览:909
东莞市社会保险基金管理局地址 浏览:273
亚洲指数基金 浏览:80
金融公司贷款倒闭了怎么办 浏览:349
金融服务人员存在的问题 浏览:303
怎样开展普惠金融服务 浏览:123
今天鸡蛋期货交易价格 浏览:751
汕头本地证券 浏览:263
利市派股票代码 浏览:104
科创板基金一周年收益 浏览:737
2016年指数型基金 浏览:119