Apache Spark中实现的MapReduce设计模式

该博客是该系列文章的第一篇,讨论了MapReduce设计模式一书中的一些设计模式,并展示了如何在Apache Spark(R)中实现这些模式。

在编写MapReduce或Spark程序时,考虑执行作业的数据流很有用。 即使Pig,Hive,Apache Drill和Spark数据框使分析数据变得更加容易,在较低级别理解流还是很有用的,就像使用Explain理解查询计划一样有价值。 考虑这一点的一种方法是对模式类型进行分组,这些模式是用于解决常见和常规数据处理问题的模板。 以下是MapReduce书籍中MapReduce模式的类型列表:

  • 汇总模式
  • 过滤模式
  • 数据组织模式
  • 联接模式
  • 元模式
  • 输入和输出模式

在这篇文章中,我们将介绍一种汇总模式,即数值汇总。

数值总结

数值汇总是一种用于计算数据汇总统计值的模式。 目的是按关键字段对记录进行分组,并计算每组的汇总,例如最小值,最大值,中位数。 MapReduce设计模式手册中的下图显示了该模式在MapReduce中的一般执行。

MapReduce-ApacheSpark-Blog-Img1

此聚合模式对应于在SQL中使用GROUP BY ,例如:

SELECT MIN(numericalcol1), MAX(numericalcol1),COUNT(*) FROM table GROUP BY groupcol2;

在Pig中,这对应于:

b = GROUP a BY groupcol2;
c = FOREACH b GENERATE group, MIN(a.numericalcol1),MAX(a.numericalcol1), COUNT_STAR(a);

在Spark中,键值对RDD通常用于按键分组以执行聚合,如MapReduce图所示,但是,使用Spark Pair RDDS,您不仅具有Map和Reduce 功能 ,还具有更多功能 。

我们将使用以前在Spark Dataframes上的博客中的数据集介绍一些汇总示例。 数据集是一个.csv文件,由在线拍卖数据组成。 每个拍卖都有一个与其关联的拍卖ID,并且可以有多个出价。 每行代表一个出价。 对于每个出价,我们都有以下信息:

MapReduce-ApacheSpark-Blog-Img2

(在代码框中,注释为绿色,输出为蓝色)

下面,我们从ebay.csv文件加载数据,然后使用Scala案例类定义与ebay.csv文件相对应的Auction模式。 然后,将map()转换应用于每个元素以创建Auction对象的AuctionRDD。

//  SQLContext entry point for working with structured data
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
// this is used to implicitly convert an RDD to a DataFrame.
import sqlContext.implicits._
// Import Spark SQL data types and Row.
import org.apache.spark.sql._
//define the schema using a case class
case class Auction(auctionid: String, bid: Double, bidtime: Double, bidder: String, bidderrate: Integer, openbid: Double, price: Double, item: String, daystolive: Integer)
// create an RDD of Auction objects
val auctionRDD= sc.textFile("ebay.csv").map(_.split(",")).map(p => Auction(p(0),p(1).toDouble,p(2).toDouble,p(3),p(4).toInt,p(5).toDouble,p(6).toDouble,p(7),p(8).toInt ))

下图显示了Spark的一般执行情况,用于计算项目每次竞价的平均出价。

MapReduce-ApacheSpark-Blog-Img3

相应的代码如下所示。 首先,创建一个键值对,其中拍卖ID和商品为键,出价金额为1,例如(((id,item),bid amount,1))。 接下来,reduceBykey执行投标金额的总和和投标金额的总和,以获得总投标金额和计数。 mapValues计算平均值,即总出价金额/出价计数。

//  create key value pairs of ( (auctionid, item) , (bid, 1))
val apair = auctionRDD.map(auction=>((auction.auctionid,auction.item), (auction.bid, 1)))
//  reducebyKey  to get  the sum of  bids  and count sum
val atotalcount = apair.reduceByKey((x,y) => (x._1 + y._1, x._2 + y._2))  
//  get a couple results
atotalcount.take(2)
// Array(((1641062012,cartier),(4723.99,3)), ((2920322392,palm),(3677.96,32)))
//  avg  = total/count
val avgs =  atotalcount.mapValues{ case (total, count) => total.toDouble / count } 
//  get a couple results
avgs.take(2)
// Array(((1641062012,cartier),1574.6633333333332), ((2920322392,palm),114.93625))// This could also be written like this
val avgs =auctionRDD.map(auction=>((auction.auctionid,auction.item), (auction.bid, 1))).reduceByKey((x,y) => (x._1 + y._1, x._2 + y._2)).mapValues{ case (total, count) => total.toDouble / count }

也可以使用java Math类或spark StatCounter类来计算统计信息,如下所示

import java.lang.Math
// Calculate the minimum bid per auction
val amax = apair.reduceByKey(Math.min)
//  get a couple results
amax.take(2)
// Array(((1641062012,cartier),1524.99), ((2920322392,palm),1.0))import org.apache.spark.util.StatCounter
// Calculate  statistics on the bid  amount per auction
val astats = apair.groupByKey().mapValues(list => StatCounter(list))
//  get a  result
astats.take(1)
// Array(((1641062012,cartier),(count: 3, mean: 1574.663333, stdev: 35.126723, max: 1600.000000, min: 1524.990000)))

Spark DataFrames提供了一种特定于域的语言来进行分布式数据操作,从而使执行聚合更加容易。 此外,DataFrame查询的性能要优于使用PairRDD进行编码,因为它们的执行是由查询优化器自动优化的。 这是一个使用DataFrames来按Auctionid和item获取最低,最高和平均出价的示例:

val auctionDF = auctionRDD.toDF()
// get the max, min, average bid by auctionid and item
auctionDF.groupBy("auctionid", "item").agg($"auctionid",$"item",  max("bid"), min("bid"), avg("bid")).show auctionid  item    MAX(bid) MIN(bid) AVG(bid)          
3016429446 palm    193.0    120.0    167.54900054931642
8211851222 xbox    161.0    51.0     95.98892879486084

您还可以使用Spark SQL在使用DataFrames时使用SQL。 本示例按Auctionid和Item获取最高,最低,平均出价。

// register as a temp table inorder to use sql
auctionDF .registerTempTable("auction")
// get the max, min, average bid by auctionid and item
val aStatDF = sqlContext.sql("SELECT auctionid, item, MAX(bid) as maxbid, min(bid) as minbid, avg(bid) as avgbid FROM auction GROUP BY auctionid, item")
// show some results
aStatDF.show
auctionid  item    maxbid minbid avgbid            
3016429446 palm    193.0  120.0  167.549           
8211851222 xbox    161.0  51.0   95.98892857142857

摘要

这是本系列文章的第一部分,该系列文章将讨论使用Spark实现的一些MapReduce设计模式。 讨论非常紧凑,有关模式的更多信息,请参阅MapReduce设计模式手册,有关Spark Pair RDD的更多信息,请参阅“ 学习Spark Key值对”一章。

参考和更多信息

  • 免费的交互式电子书– Apache Spark入门:从开始到生产
  • MapReduce设计模式书
  • DataFrame上聚合的方法
  • 免费的Spark on Demand培训

翻译自: https://www.javacodegeeks.com/2015/11/mapreduce-design-patterns-implemented-in-apache-spark.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Token注解防止表单的重复提交

注解的一些基础: 参见http://blog.csdn.net/duo2005duo/article/details/50505884和 http://blog.csdn.net/duo2005duo/article/details/50511476这两篇文章 1,自定义一个注解Token 用来标记需要防止重复提交的方法 1 package com.bjca.framework.util;2…

计算机主机风扇安装方法,电脑机箱怎么安装风扇减震胶钉保护主板cup?

炎炎夏日,是时候给你的爱机清清灰,特别是对于机箱散热不好的朋友就需要给电脑机箱装上几个风力强劲的风扇,这样可以大大减少CPU、主板等的老化时间,延长爱机的寿命。现在机箱风扇大都使用橡胶拉钉(或者叫减震钉、固定钉)安装&…

2个css特效冲突了怎么办_患上类风湿病怎么办?2个方法拿走不谢

类风湿是一种常见的疾病,类风湿关节炎简称为类风湿,是一个累及周围关节为主的多系统性炎症性自身免疫病,患者的关节疼痛、肿胀,而且易反复发作。那么,得了类风湿病怎么办?得了类风湿病怎么办目前&#xff0…

将项目导入eclipse中出现的jsp页面报错

图片摘自百度经验&#xff0c;实在是每次都会忘了步骤&#xff0c;每次都得重新百度&#xff0c;所以索性自己总结到博客中&#xff0c;下次如果还记不住就直接从博客中看。原谅我实在学渣&#xff0c;呜呜~~~~(>_<)~~~~ 转载于:https://www.cnblogs.com/yangyufan/p/600…

怎样让计算机恢复到桌面上,如何把电脑桌面恢复成原样.怎么办?

此方案适用XP\VISTA\WIN7系统【问题描述】&#xff1a;桌面图标太多【原因分析】&#xff1a;1.下载的软件快捷方式放到桌面没有进行整理;2.在桌面上放置太多的文件【简易步骤】&#xff1a;【360安全卫士】—【功能大全】—【桌面管理】—【整理桌面个人资料】【解决方案】&am…

中装订线位置_企业宣传画册、产品目录常用的装订方法

印刷是个专业活&#xff0c;特别是画报、画册这些种类多&#xff0c;要求高。下面介绍一下最常用到的三种装订方法&#xff1a;骑马订骑马订(saddlestitch)英文是马鞍的意思&#xff0c;取其于装订之时&#xff0c;将摺好的页子如同为马匹上鞍一般的动作&#xff0c;配至装订机…

使用Hibernate在CQRS读取模型中进行快速开发

在这篇文章中&#xff0c;我将分享一些在CQRS读取模型中使用Hibernate工具进行快速开发的技巧。 为什么要休眠&#xff1f; 休眠非常流行。 从外观上看&#xff0c;它也很容易&#xff0c;而从内部看&#xff0c;它却相当复杂。 它可以很容易地开始使用&#xff0c;而无需进行…

iOS - Swift NSData 数据

本文目录 前言1、NSData 的创建2、数据的长度3、数据的获取4、NSData 的比较5、NSData 的存储6、NSData 与 字符串 的相互转换7、NSData 与 Base64编码字符串 的相互转换回到顶部前言 public class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCoding public cla…

美国东北大学khoury计算机学院,2021年美国东北大学计算机研究生专业有哪些?入学要求高吗?...

在“唯才是用”的时代&#xff0c;高新科技行业人才成为了社会的主流&#xff0c;各行各业也都急需计算机相关人才&#xff0c;美国可谓是计算机领域的鼻祖&#xff0c;拥有着非常先进的互联网技术&#xff0c;除此之外&#xff0c;几乎每所大学都开设了计算机专业&#xff0c;…

c++进制转换代码_轻松实现C/C++各种常见进制相互转换,你还不会你就落后了

这篇文章主要介绍了轻松实现C/C各种常见进制相互转换&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧其它进制转为十进制在实现这个需求之前&#xff0c;先简单介绍一…

我的博客是怎么自定义的

第一步&#xff0c;打开设置&#xff0c;一切都在设置里进行&#xff0c;让我们从头到尾&#xff0c;从左到右一步步讲。 1.头像 此头像不是账号头像&#xff0c;是标题那里放图片当头像 <img src"你头像的地址" alt"" /> 步骤&#xff1a;将你喜欢…

2017年计算机三级网络技术试题,2017年计算机三级网络技术考前试题及答案(8)

三、应用题(共20分)请根据下图所示网络结构回答问题。1&#xff0e;填写路由器RG的路由表项(每空2分&#xff0c;共l0分)。2&#xff0e;如果该网络内服务器群的IP地址为58&#xff0e;45&#xff0e;57&#xff0e;11-58&#xff0e;45&#xff0e;57&#xff0e;25&#xff0…

byte数组转为string_String类

API ----StringBufferjava.lang.Object 继承者 java.lang.Stringpublic final class String extends Object implements Serializable, Comparable<String>, CharSequenceYuSLi&#xff1a;String类速查速记​zhuanlan.zhihu.comYuSLi&#xff1a;补充&#xff1a;String…

AngularJS的学习笔记(二)

只给自己看的。 AngularJS 表达式 angularjs 使用表达式将数据绑定到html中。 AngularJS 表达式写在双大括号内&#xff1a;{{ expression }}。 AngularJS 表达式把数据绑定到 HTML&#xff0c;这与 ng-bind 指令有异曲同工之妙。 AngularJS 将在表达式书写的位置"输出&qu…

亚型多态性应用于元组的危险

Java 8具有lambda和stream&#xff0c;但是没有元组&#xff0c;这真是令人遗憾 。 这就是为什么我们在jOOλ中实现了元组-Java 8缺少的部分 。 元组确实是无聊的值类型容器。 本质上&#xff0c;它们只是这些类型的枚举&#xff1a; public class Tuple2<T1, T2> {publ…

广西计算机二级450034考点,广西计算机等级考试报名地点

2010年下半年全国计算机等级考试时间是2010年9月18日至22日&#xff0c;第一天上午考笔试&#xff0c;上机考试从笔试的当天下午开始(一级从上午开始)。2010年下半年全国计算机等级考试报名时间已经开始&#xff01;如果您是在校生&#xff0c;去学校相关报名处报名最方便&…

HBuilder完成webApp入门(3) 关于webview (转)

个人认为WebView是 html5 API的一个非常重要的部分。 WebView 的帮助文档http://www.html5plus.org/doc/zh_cn/webview.html 为什么对WebView的掌握很重要&#xff1f;因为它是一个HTML5 APP的基础。刚刚学习HBuilder的同学一般会将重点放在 mui 组件上。mui 提供了很多默认的方…

ca证书 csr_linux下使用openssl生成 csr crt CA证书

证书文件生成:一.服务器端1.生成服务器端 私钥(key文件);openssl genrsa -des3 -out server.key 1024运行时会提示输入密码,此密码用于加密key文件(参数des3是加密算法,也可以选用其他安全的算法),以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令.如果不要口…

佛山市南海技师学校计算机类,佛山南海信息技术学校2021年有哪些专业

即将面临毕业的时候&#xff0c;同学们都要选择学校&#xff0c;都要选择专业就读&#xff0c;至于选择什么&#xff0c;就是一大难题了。学习是重要的事情&#xff0c;选择更是件大事。小编整理了学校的招生专业详情&#xff0c;仅供参考。佛山南海信息技术学校专业名单&#…

java nio拷贝文件_Java 7 – NIO文件革命

java nio拷贝文件Java 7&#xff08;“项目代币”&#xff09;已于去年7月问世。 此版本中的新增功能很有用&#xff0c;例如&#xff0c;尝试资源-从try块中自动处理可关闭的资源&#xff0c;switch语句中的字符串&#xff0c;用于异常的multicatch以及用于处理泛型的<>…