spark graphx 学习

最近在使用图计算 涉及到用户的关系 折腾了好几天

第一步:先看下用户生成的neo4j图吧  =====》》》这个是拿了一位大佬的测试数据图

生成这个图的逻辑很简单,只需要创建csv文件

举例:

用户的邀请关系 :

csv1    列名   user_id:ID,:LABEL (里面是用户ID及我写了一个节点名称)

csv2    列名    :START_ID,name,:END_ID,:TYPE (我这里先放了用户邀请ID,及被邀请人用户ID,其他两个字段是名称)

注意⚠️:

1.字段名是有:这个符号的,csv文件对格式的要求挺严格的

2.放的是csv文件,而非文件夹,因为一般sparkjob生成的都是文件夹

3.csv文件不可以有重复的值,写进去记得去重下

 

第二步:使用spark graphx

1.学习肯定要先去官网快速的学习一下 http://spark.apache.org/docs/latest/graphx-programming-guide.html#neighborhood-aggregation

2.了解了基础的知识,可以自己写了,加入jar包

   <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-graphx_${scala.main.version}</artifactId>
            <version>${spark.version}</version>
        </dependency>

3.最重要的一点!!!!

看需求是要的什么数据,如果是要用户的二度人脉的话,可以参看这个代码

import org.apache.spark.graphx._



val edges: RDD[Edge[ED]] = sc.textFile(s"").map(line => {
      val tokens = line.split(",")
      Edge[ED](tokens(0).toLong, tokens(1).toLong, null)
    })

    val graph: Graph[VD, ED] = Graph.fromEdges[VD, ED](edges, VD(mutable.Map[Long, Long]()))

    val reverseGraph = graph.reverse

    val relate: VertexRDD[List[Long]] = reverseGraph.aggregateMessages[List[Long]](
      triplet => {
        triplet.sendToDst(List(triplet.srcId))
      },
      (a,b) => (a++b)
    )

    val userArrayDF = relate.map( m=> {
      val a =m._1.toLong
      m._2.:+(a)
    } )

备注: 这里面的text文件格式就是普通的(1,2)这种

然后如果是要和这个用户有关系的所有用户的话,可以参考这个代码(顺便含泪吐槽下~这玩意我整了好久好久)

val compactBufferRDD = graph.connectedComponents
      .vertices
      .map(_.swap)
      .groupByKey()
      .map(_._2)

因为我的需求是用户形成组,那么每天用户的关系都是不同的,传统的方法就是for循环,那么多数据for循环要很久,我又跑过5哥小时左右,用了这个方法之后,那速度简直了~~

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值