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,一经查实,立即删除!

相关文章

计算机主机风扇安装方法,电脑机箱怎么安装风扇减震胶钉保护主板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;而无需进行…

美国东北大学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…

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

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

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

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

创建 floating IP - 每天5分钟玩转 OpenStack(106)

先复习一下前面我们讨论的知识。 当租户网络连接到 Neutron router&#xff0c;通常将 router 作为默认网关。当 router 接收到 instance 的数据包&#xff0c;并将其转发到外网时: 1. router 会修改包的源地址为自己的外网地址&#xff0c;这样确保数据包转发到外网&#xff…

把ipa文件上传到服务器,windows电脑上传ipa到appstore的详细流程

在使用H5混合开发的app打包后&#xff0c;需要将ipa文件上传到appstore进行发布&#xff0c;就需要去苹果开发者中心进行发布。但是在苹果开发者中心无法直接上传ipa文件&#xff0c;它要求我们使用xcode或transport等工具上传ipa文件&#xff0c;但是xcode和transport不能安装…

Java的5个古怪问题

我们有机会尝试了一些最奇怪的Java难题 即使是最有经验的Java开发人员&#xff0c;也会在这篇文章中发现令人困惑的问题。 或至少是有趣的&#xff08;绝对不公平&#xff09;。 在经历了Java Deathmatch冒险之后&#xff0c;我们决定这次发布一系列不同的问题&#xff0c;着重…

js 取得数组下标_数组的介绍及使用

JavaScript 中的数组常用于在单个变量中存储多个值。数组就是一组数据的集合&#xff0c;在内存中表现为一段连续的内存地址(保存在堆内存)。创建数组的目的就是为了保存更多的数据。数组概念和语法概念&#xff1a;数组是一个特殊变量&#xff0c;一次可以容纳多个值。特点&am…

bigdecimal取小数部分_小数精度丢失问题分析和解决

无论在什么业务中&#xff0c;钱?是非常重要的东西&#xff0c;对账的时候一定要对的上&#xff0c;不能这边少一分钱那边多一分钱。对于数值的计算&#xff0c;尤其是小数&#xff0c;floate和double都是禁止使用的。阿里强制要求存放小数时使用 decimal&#xff0c;禁止使用…

使用LinkedList模拟一个堆栈或者队列数据结构

使用LinkedList模拟一个堆栈或者队列数据结构。 堆栈&#xff1a;先进后出 如同一个杯子。 队列&#xff1a;先进先出 如同一个水管。 import java.util.LinkedList;public class DuiLie {private LinkedList link;public DuiLie() {link new LinkedList();}public void m…

k40游戏增强版服务器维护中,Redmi K40 游戏增强版发布,第四台 K40 出现了

原标题&#xff1a;Redmi K40 游戏增强版发布&#xff0c;第四台 K40 出现了今晚 Redmi 发布了旗下的新款游戏手机 —— Redmi K40 游戏增强版&#xff0c;这也是K40、K40 Pro、K40 Pro 之后的又一款 K40 产品&#xff0c;主打的是专游戏功能和轻薄设计。Redmi K40 游戏增强版使…