GraphX官网例子AggregateMessagesExample分析

AggregateMessagesExample.scala

聚合消息示例

 

这段代码使用GraphGenerators.logNormalGraph函数创建了一个随机的图。该函数的传入参数为SparkContext对象sc和顶点的数量numVertices。

使用mapVertices函数,为图的每个顶点分配一个初始值。MapVertices函数的第一个参数是一个函数,用于为每个顶点的ID和属性值进行操作。在这个例子中,函数的第一个参数是顶点的ID,第二个参数是顶点的属性值(_,表示不使用)。

最终得到的图的类型为Graph[Double,Int],其中,Double是顶点属性的类型,Int是边属性的类型。这段代码的作用是生成一个具有100个顶点的随机图,并将每个顶点的属性值设置为顶点的ID(转化为了Double类型)。这些顶点没有边属性,边的默认属性为Int类型。

随机生成的图有100个节点,不确定条边,以及与边数量相当的元组。

这段代码根据特定条件计算了年龄较大的关注者的数量和他们的总年龄。

这里调用graph图的aggregateMessages函数,在图的顶点之间发送消息并根据指定的条件对他们进行聚合。它主要接受两个参数,一个是Map函数,另一个是Reduce函数。

Map函数中,对于每一个三元组triplets(源顶点、边、目标顶点),它检查源顶点的属性(即关注者的年龄)是否大于目标顶点的属性(被关注者的年龄)。如果条件为真,则向目标顶点发送一个包含元组(1,triplet.srcAttr)的消息,其中1表示计数器,triplet.srcAttr表示关注者的年龄。

Reduce函数中,他将两个元组(a._1,a._2)和(b._1,b._2)作为输入参数。将计数器和年龄都相加,得到新的元组(a._1+b._1,a._2+b._2)。最后将Reduce的结果存储在olderFollowers中。(这是一个点的RDD结构)

这一步处理的结果产生的结果如下图所示:

 

其格式为:(顶点id,(关注人数,关注总年龄))

但是数量并非100个,因为有的节点(对应的博主)没有粉丝,因此reduce的时候就不会将这些没有粉丝的博主纳入新的RDD中。产生结果的数量一般在90多个。

 

 

这段代码用于计算年龄较大的关注着的平均年龄,它基于先前计算得到的年龄较大的关注着的数量和总年龄。

avgAgeOfOlderFollowers是一个类型为VertexRDD[Double]的变量,用于存储计算结果,即年龄较大的关注者的平均年龄。

olderFollowers是之前计算得到的年龄较大关注者的数量和总年龄。

在mapValues函数中,对于每一个键值对(id,value)其中value是一个元组(count,totalAge),表示年龄较大的关注着的数量和总年龄。使用模式匹配将元组解构为(count,totalAge),最后计算平均年龄,即将总年龄除以关注者的数量,得到的结果将作为新的值。

最后,用collect函数收集并使用foreach函数遍历avgAgeOfOlderFollowers中的结果,并使用println打印出来,这样就可以现实年龄较大的关注者的平均年龄了。

附:Scala模式匹配的相关语法

使用match和case关键字进行配合:

最简单的模式匹配实例:

 

其功能可以类比与java中的switch

值得主义的是,模式匹配中可以使用样例类匹配

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值