Spark大数据技术与应用(第3版)(微课版)课件 项目7 统计得分排名前10的网页-Spark GraphX图计算框架V1.0_第1页
Spark大数据技术与应用(第3版)(微课版)课件 项目7 统计得分排名前10的网页-Spark GraphX图计算框架V1.0_第2页
Spark大数据技术与应用(第3版)(微课版)课件 项目7 统计得分排名前10的网页-Spark GraphX图计算框架V1.0_第3页
Spark大数据技术与应用(第3版)(微课版)课件 项目7 统计得分排名前10的网页-Spark GraphX图计算框架V1.0_第4页
Spark大数据技术与应用(第3版)(微课版)课件 项目7 统计得分排名前10的网页-Spark GraphX图计算框架V1.0_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

统计得分排名前10的网页

——SparkGraphX图计算框架项目背景当海量信息如潮水般涌来,如何判断一条信息、一个网页的真正价值?这个问题不仅困扰着普通用户,也对整个互联网生态提出了严峻挑战。互联网作为信息传播的重要载体,更需要通过科学的方法识别和提升页面价值,从而更好地服务用户、促进信息的有效流动。

PageRank即网页排名,又称网页级别或佩奇排名,是用于标识网页的等级或重要性的一种算法,也是衡量网站好坏的一种标准。通过PageRank算法可以计算网页的价值(得分),使等级更高、更重要的网页在搜索结果中更容易被查找到,从而提高搜索结果的相关性和质量。项目背景现有两份关于某资讯网站的数据文件,一份为网页信息数据文件news_vertices.csv,另一份为网页之间的链接关系数据文件news_edges.csv,两份文件的数据字段均使用逗号进行分隔,字段说明如下。字段名称说明id自定义的简化的网页IDnetwork_id网页IDpage_type网页类型,包括4种类型,分别为人才招聘、社区论坛、教育文化和新闻媒体字段名称说明id_1简化的起始网页IDid_2简化的连接网页IDSparkGraphX简介GraphX常用API项目实施SparkGraphX简介图的基本概念图计算的应用GraphX的基础概念GraphX的发展图的基本概念图的结构通常表示为G(V,E)。G表示一个图,V是图G中顶点的集合,E是图G中边的集合。图的每个顶点都代表了一个重要的对象,每一条边则代表了两个对象之间的关系。有向图是由顶点和弧(有向边)构成的,无向图是由顶点和无向边构成的,如图所示。若任意两个顶点之间都存在边,则该图称为完全图;若这些边都有方向,则称为有向完全图。如果无重复的边或顶点到自身的边那么该图称为简单图。图计算的应用图计算的应用几个常见案例:淘宝图谱计算平台新浪微博社交网络分析淘宝、腾讯的推荐应用GraphX的发展GraphX的发展历程:SparkGraphX简介GraphX常用API项目实施创建与存储图GraphX中一些专业名称解释说明:Edge:边对象,Edge,存有srcId、dstId、attr3个参数,以及一些操作边的方法。RDD[Edge]:存放边对象的RDD。EdgeRDD:提供边的各种方法的对象。RDD:存放顶点的RDD,顶点有VertexId(顶点ID)和VD(顶点属性)。VertexRDD:提供顶点的各种方法的对象。EdgeRDD与RDD[Edge]之间、VertexRDD与RDD[(VertexId,VD)]之间的继承关系:EdgeRDD继承RDD[Edge]。VertexRDD[VD]继承RDD[(VertexId,VD)]。图的创建GraphX有一个Graph类,对Graph类进行实例化可得到一个Graph对象。Graph对象是用户的操作入口,包含边属性、顶点属性、创建图的方法、查询的方法和其他转换的方法等。在HDFS中有两个数据文件,vertices.txt(用户ID、姓名和职业)作为顶点数据,用户ID为顶点ID,其他为顶点属性。edges.txt作为边数据,包含起点用户ID、目标点用户ID、边属性3个字段。根据顶点数据和边数据,构建用户关系网络图。顶点数据包含用户ID和用户属性,边数据包含起点和目标点,并且具有边属性和指向关系。图的创建例如,5指向3,属性“Advisor”表示的是用户5是用户3的顾问。图的创建在SparkGraphX中进行图计算操作时,需要先导入指定的包。创建图的3种方法:importorg.apache.spark._importorg.apache.spark.graphx._importorg.apache.spark.rdd.RDD方法描述Graph(vertices,edges,defaultVertexAttr)根据分开存放的顶点数据和边数据创建图,适用于有顶点数据和边数据的情况Graph.fromEdges(RDD[Edge[ED]],defaultValue)根据边数据创建图,数据需要转换成RDD[Edge[ED]]类型,适用于边数据有边属性的情况Graph.fromEdgeTuples(rawEdges:RDD[(VertexId,VertexId)],defaultValue)根据边数据创建图,边数据需要加载为二元组,可以选择是否对边分区,适用于边数据只有起点和目标点的情况图的创建1.根据有属性的顶点和边构建图(Graph())使用Graph()方法构造图时,默认使用Graph的apply()方法。Graph()方法有以下3个参数:vertices:RDD[(VertexId,VD)]:“顶点”类型的RDD,其中VertexId为顶点ID(其类型必须为Long类型),VD为顶点属性信息。edges:RDD[Edge[ED]]:“边”类型的RDD,Edge类包含srcId(起点,Long类型)、dstId(目标点,Long类型)、attr(边属性)3个参数。defaultVertexAttr:一个固定的顶点信息,数据中出现顶点缺失情况时使用。图的创建在这3个参数中,必须设置前两个参数,最后一个参数为可选项。“顶点”和“边”类型的RDD来自不同的数据源,所以需要一份顶点数据文件和一份边数据文件。根据vertices.txt的顶点数据和edges.txt的边数据创建图,首先创建“顶点”类型的RDD和“边”类型的RDD,再利用这两个RDD创建图。valusers=sc.textFile("/tipdm/data/vertices.txt").map{line=>vallines=line.split("");(lines(0).toLong,(lines(1),lines(2)))}valrelationships=sc.textFile("/tipdm/data/edges.txt").map{line=>vallines=line.split("");Edge(lines(0).toLong,lines(1).toLong,lines(2))}valdefaultUser=("JohnDoe","Missing")valgraph_urelate=Graph(users,relationships,defaultUser)图的创建对于创建完成的图graph_urelate,可以使用graph_urelate.vertices查看顶点信息,用graph_urelate.edges查看边信息。图的创建2.根据边创建图(Graph.fromEdges())Graph.fromEdges()方法使用起来比较简单,仅由“边”类型RDD建立图,如果边没有属性,则将其设置为一个固定值,“边”中出现的所有顶点(起点、目标点)作为图的顶点集,顶点属性将被设置为默认值。Graph.fromEdges()方法有以下两个参数值:RDD[Edge[ED]]:“边”类型的RDD。defaultValue:VD:默认顶点属性值。图的创建根据边创建图只需要用到边数据。仅根据edges.txt中的边数据创建图,顶点由边数据中出现的顶点决定。使用graph_fromEdges.vertices和graph_fromEdges.edges对图的顶点和边进行查询。valrecords=sc.textFile("/tipdm/data/edges.txt")valfollowers=records.map{casex=>valfields=x.split("");Edge(fields(0).toLong,fields(1).toLong,fields(2))}valgraph_fromEdges=Graph.fromEdges(followers,1L)图的创建3.根据边的两个顶点的二元组创建图(Graph.fromEdgeTuples())Graph.fromEdgeTuples()方法通过边的两个顶点的顶点ID组成的二元组创建图的,不包括边属性,将一条边的起点与目标点放在一个二元组中,通过边的二元组RDD创建图。Graph.fromEdgeTuples()方法有以下3个输入参数:rawEdges:RDD[(VertexId,VertexId)]:其中的数据是由起点与目标点组成的元组。defaultValue:VD:默认顶点属性值。uniqueEdges:Option[PartitionStrategy]=None:是否对边进行分区的选项,默认不分区。图的创建Graph.fromEdgeTuples()方法仅需要边的起点和目标点。将edges.txt文件的数据作为输入数据,通过Graph.fromEdgeTuples()方法创建图。使用graph_fromEdgeTuples对象的vertices和edges属性对图的边和顶点进行查询。valfile=sc.textFile("/tipdm/data/edges.txt")valedgesRDD=file.map(line=>line.split("")).map(line=>(line(0).toLong,line(1).toLong))valgraph_fromEdgeTuples=Graph.fromEdgeTuples(edgesRDD,1L)图的缓存及释放常见的图的缓存和释放缓存方法:方法描述cache()缓存整个图,默认存储在内存中persist(newLevel:StorageLevel=StorageLevel.MEMORY_ONLY)缓存整个图,可以指定存储级别unpersist(blocking:Boolean=false)释放整个图的缓存unpersistVertices(blocking:Boolean=false)释放顶点缓存edges.unpersist(blocking:Boolean=false)释放边缓存图的缓存及释放1.图的缓存缓存有cache()和persist()两种方法。对于persist()方法,如果需要指定缓存类型,则需导入org.apache.spark.storage.StorageLevel类。指定缓存位置为内存时,写入的参数为StorageLevel.MEMORY_ONLY。importorg.apache.spark.storage.StorageLevelgraph_urelate.cache()graph_fromEdges.persist()graph_fromEdgeTuples.persist(StorageLevel.MEMORY_ONLY)图的缓存及释放2.释放缓存释放缓存的方法有以下3种:Graph.unpersist(blocking=false):释放整个图的缓存(blocking参数默认为false,表示调用后立即返回,对应数据释放操作将在后台执行)。Graph.unpersistVertices(blocking=false):释放内存中缓存的顶点。Graph.edges.unpersist(blocking=false):释放边的缓存。释放graph_fromEdges图的缓存。graph_fromEdges.unpersist(blocking=true)graph_fromEdges.unpersistVertices(blocking=true)graph_fromEdges.edges.unpersist(blocking=true)数据查询数据查询的方法:查询用户关系网络图的顶点和边的数量:方法描述numVertices查询顶点个数numEdges查询边数degrees(in/out)查询度数vertices查询顶点信息edges查询边信息数据查询SparkGraphX中有3种基本视图可以访问:假设Graph的实例graph,通过graph.vertices、graph.edges、graph.triplets即可访问3种视图。顶点视图有两种方法可以查看顶点的信息(顶点ID和顶点属性):通过graph.vertices返回VertexRDD[VD]类型的数据。使用Scala的case表达式解构元组,查看顶点信息。数据查询Scala的case表达式解构元组:通过graph.vertices.collect直接查看顶点信息通过模式匹配解构元组,查询顶点信息增加过滤条件的顶点视图通过下标查询数据查询边视图只返回边的信息,包括起始点ID、目标点ID和边属性。graph.edges返回一个包含Edge[ED]对象的EdgeRDD,ED表示边属性的类型。Edge有3个字段,即起点ID、目标点ID和边属性,并且可以通过case类的类型构造器匹配并返回EdgeRDD。查询方式:通过graph.edges.collect直接查看所有边信息通过模式匹配解构并且添加过滤条件通过下标查询数据查询三元组整体视图逻辑上将顶点和边的属性保存为一个RDD[EdgeTriplet[VD,ED]],包含EdgeTriplet类的实例。EdgeTriplet类继承于Edge类,因此可以直接访问Edge类的3个属性,并且加入了srcAttr和dstAttr成员,这两个成员分别包含起点和目标点的属性。graph.triplets可以用于查看边和顶点的所有信息,是一个完整的视图。具体使用介绍如下:通过graph.triplets.collect直接查询边和顶点的所有信息通过下标查询数据查询Graph类中度分布计算主要有3个方法:degrees:返回每个顶点的度数,不需要参数。graph.degrees返回的是VertexRDD[Int]类型,即(VertexID,Int),元组的第一个元素为计算度数的顶点,第二个元素为该顶点的度数。inDegrees:计算每个顶点的入度数,不需要参数。outDegrees:计算每个顶点的出度数,不需要参数。查询用户关系网络图中每个顶点的总度数,即入度数和出度数。数据查询使用RDD内置的min()、max()、sortByKey()、top()等方法可以对度统计最大值和最小值、排序、取出度数排在前N位的顶点。graph.degrees返回的是VertexRDD[Int],即(VertexID,Int)。需要将其转换成RDD[(Int,VertexID)],因为这些方法都是对第一个值(即Key)进行操作的。求度最大值、最小值,以及降序排序后度数排在前3的顶点,结果如图所示。数据转换数据转换操作常见的方法:方法描述mapVertices[VD2:ClassTag](map:(VertexId,VD)=>VD2)对顶点属性进行变换生成新的图mapEdges[ED2](map:Edge[ED]=>ED2)对边属性进行变换生成新的图mapTriplets[ED2:ClassTag](map:EdgeTriplet[VD,ED]=>ED2)作用同mapEdges,但可使用顶点属性数据转换1.mapVertices()mapVertices()方法需要一个函数来调用Spark中的map操作,以更新顶点的属性值,顶点的属性可以由VD类型转变为一个新的类型。例如,用户关系网络图中顶点有两个属性值,通过mapVertices()方法只取第一个值(姓名)作为属性值。数据转换2.mapEdges()通过mapEdges()方法,可以直接对边的属性进行操作。该方法调用Spark中的map操作来更新边的属性值,需要一个修改边属性的函数。map遍历的每一个元素都是“边”类型,最终返回一个修改了图中边属性的值或类型之后的新图。例如,修改边属性的值,将起点ID和目标点ID加入边属性中。数据转换3.mapTriplets()mapTriplets()方法调用Spark中的map操作,通过一个修改边属性的函数更新边的属性值,最终返回一个修改了图中边属性的值或类型之后的新图。与mapEdges()方法不同的是,mapTriplets()方法的每一个元素是一个包含顶点属性和边属性的三元组,因此可以使用顶点的属性。例如,对边的属性用起点属性的第一个值(姓名)进行替换。结构转换数据转换操作常见的方法:方法描述reverse反转图中所有边的方向subgraph()按照设定条件取出子图mask()取两个图的公共顶点和边作新图,并保持前一个图顶点与边的属性groupEdges合并相同边的属性结构转换某用户社交网络图顶点数据和边数据分别为user.txt、relate.txt。顶点包含用户顶点ID、姓名、年龄,边包含起点ID、目标点ID和权重(边属性,Int类型),各共3个数据字段。权重表示的是起点是目标点的追随者,即“粉丝”,指的是起点用户对目标点用户的支持度。根据顶点和边数据,创建一个简单的描述用户之间追随关系的用户社交网络图。通过Graph(vertices,edges,defaultUser)的方法创建用户社交网络图。valusers=sc.textFile("/tipdm/data/user.txt").map{line=>vallines=line.split(",");(lines(0).toLong,(lines(1),lines(2).toInt))}valrelationships=sc.textFile("/tipdm/data/relate.txt").map{line=>vallines=line.split(",");Edge(lines(0).toLong,lines(1).toLong,lines(2).toInt)}valgraph=Graph(users,relationships)graph.triplets.collect().foreach(println(_))结构转换1.reverse方法reverse方法返回的是一个新图,图的边的方向与原图相比都是反转的。没有修改顶点或边的属性,也没有改变边的数量,不需要输入其他参数。对用户社交网络图的边进行反转,结果如图所示。结构转换2.subgraph()方法subgraph()方法是创建子图的方法。子图是指节点集和边集分别是某一图的节点集的子集和边集的子集的图。在subgraph()方法中需要输入边的过滤条件或顶点的过滤条件,设置了顶点的过滤条件即可查询出满足过滤条件的顶点组成的图,设置边过滤条件即可查询出满足条件的边组成的图。如果顶点和边的过滤条件均被设置,即可查询出满足过滤条件的顶点和边组成的图。结构转换2.subgraph()方法对边和顶点同时过滤时,用“,”隔开边和顶点的过滤条件。如查询用户社交网络图中追随者支持度大于3、用户年龄大于30的顶点和边组成的子图,顶点操作通过一个指代字段vpred匹配顶点ID和属性。对于边属性,通过指代字段epred匹配,其中的属性可以通过属性名获取,结果如图所示。结构转换3.mask()方法mask()方法可以合并两个图并且只保留两个图中都有的顶点和边,在使用时需要输入另一个图作为参数。例如,将子图作为另一个图,对图graph与图subGraph3进行合并,保留两个图公共的点和边,组成新的图,并保留graph中点和边的属性,结构转换4.groupEdges()方法groupEdges()方法可以合并具有相同ID的边。groupEdges()方法将同一起点与目标点的边的属性值集合在一起,根据merge函数,对图中多重边的属性值进行合并,保证图中对应(srcID,dstID)只有一条边。groupEdges()方法需要重新对图数据进行分区,因为相同的边可以被分配到同一个分区,所以必须在调用groupEdges()方法前调用Graph.partitionBy:Graph([VD,ED])进行分区。常用的分区策略是artitionStrategy.RandomVertexCut,表示分配相同的边到同一个分区。结构转换4.groupEdges()方法例如,在用户社交网络图中有两条以3为起点、以2为目标点的边,分别为“3,2,4”和“3,2,6”;要求将两条边合并,属性值相加。首先需要调用graph.partitionBy(PartitionStrategy.RandomVertexCut)方法对图进行分区,再使用groupEdges()方法将相同边的属性值相加,结果如图所示。结构转换现有一份某用户社交网络图的顶点(用户顶点ID、姓名、年龄)和边(起点ID、目标点ID和权重)的数据。权重表示的是起点是目标点的追随者,即“粉丝”,指的是起点用户对目标点用户的支持度。根据顶点和边数据,创建一个简单的描述用户之间追随关系的用户社交网络图。通过Graph(vertices,edges,defaultUser)的方法创建用户社交网络图。结构转换基于创建的用户社交网络图,对图结构转换方法的介绍如下:reverse方法将返回一个新的图subgraph()方法是创建子图的方法mask()方法合并两个图,只保留两个图中都有的顶点和边,使用时需要输入另一个图作为参数。groupEdges()方法可以合并具有相同ID的边。数据关联聚合关联聚合操作常用的方法:方法描述collectNeighbors(edgeDirection:EdgeDirection)收集邻居顶点的顶点ID和顶点属性collectNeighborIds(edgeDirection:EdgeDirection)收集邻居顶点的顶点IDaggregateMessages()向指定顶点发送信息并聚合信息joinVertices()将顶点信息更新到图中,顶点属性值个数和类型不能变outerJoinVertices()将顶点信息更新到图中,顶点属性值个数和类型可变数据关联聚合以用户社交网络图为例,每个用户有顶点ID、属性name和age,顶点与顶点间的关系是一个权重,介绍图常用的关联聚合操作的方法。collectNeighbors()collectNeighborIds()aggregateMessages()joinVertices()outerJoinVertices()数据关联聚合1.collectNeighbors()作用:收集每个顶点的邻居顶点的顶点ID和顶点属性,邻居顶点就是与该点直接相连的顶点。该方法需要输入一个参数,返回的结果是顶点ID和顶点属性的元组。参数有以下几种类型:EdgeDirection.Out:表示只收集以该顶点为起点、以邻居顶点为目标点的邻居顶点的顶点ID和顶点信息。EdgeDirection.In:表示只收集以邻居顶点作为起点、以该点作为目标点的邻居顶点的顶点ID和顶点信息。EdgeDirection.Either:收集所有邻居顶点的顶点ID和顶点信息。数据关联聚合分别使用3种参数查询用户社交网络图中每个顶点的邻居顶点的顶点ID和顶点属性。数据关联聚合2.collectNeighborIds()collectNeighborIds()方法的使用方式与collectNeighbors()方法的使用方式一致,但collectNeighborIds()方法只返回顶点ID,不返回顶点属性。数据关联聚合3.aggregateMessages()图分析任务的关键步骤之一是汇总每个顶点附近的信息。aggregateMessages()方法是GraphX中的核心聚合操作,主要功能是向其他顶点发消息,聚合每个顶点收到的消息,返回VertexRDD[A]类型的结果,A为某种数据类型。aggregateMessages()方法使用的语法格式:defaggregateMessages[Msg:ClassTag](sendMsg:EdgeContext[VD,ED,Msg]=>Unit,mergeMsg:(Msg,Msg)=>Msg,tripletFields:TripletFields=TripletFields.All)数据关联聚合3.aggregateMessages()在aggregateMessages()方法中,会将用户定义的sendMsg函数应用到图的每个边三元组,并对其目标点应用mergeMsg函数聚合数据。具体过程如下。将sendMsg函数看作Hadoop的MapReduce过程中的Map阶段,负责向邻边发消息。函数的左侧为每个边三元组,包括边的起点、目标点、属性,以及起点的属性和目标点的属性;右侧为需要发送的顶点类型以及发送的信息。将用户自定义的mergeMsg函数应用于每一个顶点,对sendMsg过程中发送到各顶点的数据进行合并。TripletFields参数可指出哪些数据将被访问,有3种可选择的值,即TripletFields.Src、TripletFields.Dst和TripletFields.All,分别表示源顶点特征、目标点特征和两者同时。数据关联聚合例如,通过aggregateMessages()方法计算每个用户的追随者(即边的起点)的平均年龄。在sendMsg阶段,对每一个目标点发送起点的age属性值以及一个计数值1。在mergeMsg阶段,统计age总值和计数总值。最后,将每个顶点对应的年龄总值与计数总值相除,求出每个顶点的追随者平均年龄(这里假定追随者至少有一个)。valolderFollowers=graph.aggregateMessages[(Int,Int)](triplet=>{triplet.sendToDst((1,triplet.srcAttr._2))},(a,b)=>(a._1+b._1,a._2+b._2),TripletFields.All)valavgAgeOfOlderFollowers:VertexRDD[Double]=olderFollowers.mapValues((id,value)=>valuematch{case(count,totalAge)=>totalAge/count.toDouble})avgAgeOfOlderFollowers.collect().foreach(println(_))数据关联聚合4.joinVertices()joinVertices()方法用于连接其他顶点,将其他顶点的顶点信息与图中的顶点信息处理后,更新图的顶点信息。其返回值的类型是图结构顶点属性的类型。顶点个数不能新增,也不可以减少,即不能改变原始图结构顶点属性的类型和个数。将外部存放顶点的RDD与图进行连接。对应于图结构中的某些顶点,若RDD中无对应的属性,则保留图结构中原有属性值,不进行任何改变。对应于图结构中某些顶点,若RDD中对应的值不只一个,则只有最后一个值在进行连接操作时起作用。在这种情况下,可以选择先对顶点RDD进行处理,确保顶点不重复。数据关联聚合4.joinVertices()例如,通过aggregateMessages()方法发送信息“1”给每个边的目标点,再使用joinVertices()方法计算追随者的人数,结果会生成多个顶点。将这些顶点与图中的顶点进行连接,并将值加入图对应顶点的年龄属性中。数据关联聚合5.outerJoinVertices()与使用joinVerti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论