第一个GraphX程序
程序功能:收集顶点指向的邻居中所在地
/*
* 找出每一个顶点所指向的邻居中所在的地区
*/
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import scala.collection.mutable.Map
import org.apache.spark._
import org.apache.spark.graphx._
import org.apache.spark.rdd.RDD object testApp{
def main(args:Array[String]){
val conf = new SparkConf().setAppName("testApp")
val sc = new SparkContext(conf) val graph = GraphLoader.edgeListFile(sc, "/home/spark/spark/graphx/data/followers.txt")//载入边时顶点是边上出现的点 val users = sc.textFile("/home/spark/spark/graphx/data/users.txt").map { line =>
val fields = line.split(",")
(fields(0).toLong,(fields(1),fields(2)))//解析顶点数据:ID(一定转成Long型),姓名,地区
} val myGraph=Graph.apply(users,graph.edges)//重构图,顶点数据以users为准 val vertices=myGraph.mapReduceTriplets[Map[String,Int]](//收集每一个定点指向的邻居所在的地区
triplet=>Iterator((triplet.srcId,Map[String,Int](triplet.dstAttr._2->1))),//Map function单向发送消息给有向边的源顶点
(a,b)=>{//Reduce function汇集消息
var myMap=Map[String,Int]()
for((k,v)<-a){
if(b.contains(k))
{
var t=a(k)+b(k)
myMap+=(k->t)
}
else
myMap+=(k->a(k))
}
myMap //返回汇集的结果
}
) vertices.collect.foreach(a=>print(a+"\n"))//打印收集的邻居所在地
}
}
users.txt顶点数据:ID,姓名。地区
1,BarackObama,American
2,ladygaga,American
3,John,American
4,xiaoming,Beijing
6,Hanmeimei,Beijing
7,Polly,American
8,Tom,American
followers.txt边数据:仅仅有源顶点和目标顶点,中间以空格隔开,多余的列无用,如:2 1 other 有3列数据,可是graphx仅仅会读取前两列
2 1
4 1
1 2
6 3
7 3
7 6
6 7
3 7
结果:
(4,Map(American -> 1))
(6,Map(American -> 2))
(2,Map(American -> 1))
(1,Map(American -> 1))
(3,Map(American -> 1))
(7,Map(American -> 1))
project文件夹结构:
./test.sbt
./src
./src/main
./src/main/scala
./src/main/scala/testApp.scala
test.sbt内容:
name := "test Project" version := "1.0" scalaVersion := "2.10.4" libraryDependencies += "org.apache.spark" %% "spark-core" % "1.0.1" libraryDependencies += "org.apache.spark" %% "spark-graphx" %"1.0.1" resolvers += "Akka Repository" at "http://repo.akka.io/releases/"
命令行运行例如以下进行编译:
sbt package
命令行运行例如以下向集群提交(开启了集群为前提),这里我的project建在spark安装文件夹下apps/testApp下,因此以下开头是../../
../../bin/spark-submit --class "testApp" --master local[4] target/scala-2.10/test-project_2.10-1.0.jar
这个程序有个潜在的bug,就是Graph.apply函数另一个语义是:若多个顶点ID反复则随意选择一个顶点,若边中edges上的两个顶点有不在users中时将以默认的属性初始化该顶点,
val myGraph=Graph.apply(users,graph.edges)//重构图。顶点数据以users为准
若在兴许对图中进行操作时会发现顶点数据格式有可能不一致的情形,部分顶点在edges中存在而在users中不存在时是以默认值作为顶点数据的。而这里顶点数据是个元组(name,location),spark以null作为默认值。可能在操作图时候出现 java.lang.NullPointerException
解决的方法有两个:
1 加入顶点的默认数据
val defaultAttr=("null","null")
val myGraph=Graph.apply(users,graph.edges,defaultAttr)
2 去除那些顶点数据为null的节点和边
val myGraph=Graph.apply(users,graph.edges)//重构图。顶点数据以users为准
val newGraph=myGraph.subgraph(triplet=>triplet.srcAttr!=null && triplet.dstAttr!=null,(id,attr)=>attr!=null)//取顶点数据非null的子图
第一个GraphX程序的更多相关文章
- Spark认识&环境搭建&运行第一个Spark程序
摘要:Spark作为新一代大数据计算引擎,因为内存计算的特性,具有比hadoop更快的计算速度.这里总结下对Spark的认识.虚拟机Spark安装.Spark开发环境搭建及编写第一个scala程序.运 ...
- DirectX游戏编程(一):创建一个Direct3D程序
一.环境 Visual Studio 2012,DirectX SDK (June 2010) 二.准备 1.环境变量(如没有配置请添加) 变量名:DXSDK_DIR 变量值:D:\Software\ ...
- 第一个python程序
一个python程序的两种执行方式: 1.第一种方式是通过python解释器: cmd->python->进入python解释器->编写python代码->回车. 2.第二种方 ...
- 编写第一个MapReduce程序—— 统计气温
摘要:hadoop安装完成后,像学习其他语言一样,要开始写一个“hello world!” ,看了一些学习资料,模仿写了个程序.对于一个C#程序员来说,写个java程序,并调用hadoop的包,并跑在 ...
- 1.3 第一个C#程序
几乎没一门编程语言的第一个程序都叫“你好,世界”,所以先在visual studio 中创建一个Helloworld程序. 各部分的详细内容: Main方法是程序运行的起点,最重要的代码就写在Main ...
- 一个.net程序员的安卓之旅-Eclipse设置代码智能提示功能
一个.net程序员的安卓之旅-代码智能提示功能 过完年回来就决心开始学安卓开发,就网上买了个内存条加在笔记本上(因为笔记本原来2G内存太卡了,装了vs2010.SQL Server 2008.orac ...
- MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(02)
1.3.1 应用程序对象 MFC应用程序的核心就是基于CWinApp类的应用程序对象,CWinApp提供了消息循环来检索消息并将消息调度给应用程序的窗口.当包含头文件<afxwin.h>, ...
- Go! new Hello World, 我的第一个Go程序
以下语句摘自百度百科: Go语言是谷歌2009发布的第二款开源编程语言. Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全.支持并行进 ...
- 搭建java开发环境、使用eclipse编写第一个java程序
搭建java开发环境.使用eclipse编写第一个java程序 一.Java 开发环境的搭建 1.首先安装java SDK(简称JDK). 点击可执行文件 jdk-6u24-windows-i586. ...
随机推荐
- JavaSE-20 IO序列化
学习要点 定义 IO如何序列化 序列化 序列化:是将对象的状态存储到特定存储介质中的过程. 反序列化:从特定存储介质中的数据重新构建对象的过程. 实现了java.io.Serializable接口的类 ...
- js读取文本内容,支持csv.txt
js读取文本内容,支持csv.txt <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- 笔试算法题(14):整数二进制表示中的1 & 判定栈的push和pop序列是否对应
出题:输入一个整数,要求计算此整数的二进制表示中1的个数 分析: 如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位:当其位整数的时候,则k/2表示将其二进制表示右移一位, ...
- Ztree节点前加上两个自定义按钮
前言: 在我的权限管理模块遇到了给某些角色加权限的问题,这时就需要实现将每个模块做成树,在每个节点前加上预览和编辑的按钮,这样可以根据数据库的某个字段给每个角色赋权限. 必须必须吐槽的是,这部分的功能 ...
- ORM之单表增删改查
ORM之单表增删改查 在函数前,先导入要操作的数据库表模块,model from model所在的路径文件夹 import model 在views文件中,加的路径: #就一个app01功能的文件 ...
- [bzoj3531][Sdoi2014][旅行] (主席树+树链剖分)
Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. ...
- allegro中原理图和pcb中元件的交互
一.前言: 所谓的交互是这样的,在原理图里点击某个元件,在pcb图中就相应的被选中,这样在元器件刚导进pcb中布局放置元器件的时候可以为我们提供很大的方便. 二.前提: pcb中导入元件是这种方式: ...
- JS数组添加元素的三种方式
1.push() 结尾添加 数组.push(元素) 参数 描述 newelement1 必需.要添加到数组的第一个元素. newelement2 可选.要添加到数组的第二个元素. newelement ...
- noip模拟赛 单词
分析:这道题真心难想.最主要的是怎么样不重复. 为了不重复统计,把所有符合条件的单词分成两类,一类是某些单词的前缀,一类是 不是任何单词的前缀.涉及到前缀后缀,维护两个trie树,处理3个数组a,b, ...
- poj3440--Coin Toss(几何上的概率)
Coin Toss Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3946 Accepted: 1076 Descrip ...