Spark数据分析之有向图

本文主要阐述用python结合spark做数据分析和绘制有向图

工作需要,需要计算各个节点的出度,入度,最终表现为有向图的形式

首先数据量比较大,这块对于各个数据的抽取和出入度计算采用spark来计算

因为使用的语言是python,所以这里用的是pysark的graphframe;Pysark是spark为python开发者提供的API。

 

graphframe是将spark中的graph算法统一到DataFrame接口的Graph操作接口,支持多种语言,可以供python使用。

 

安装配置环境

安装python包:首先需要个python 的package这里我们直接下载https://github.com/graphframes/graphframes

grameframe的源码,然后把中间的python目录放到我们的python三方库路径就可以

 

spark依赖:spark解析需要一个包graphframes:0.2.0-spark1.6-s_2.10

网址在(http://spark-packages.org/package/graphframes/graphframes),要根据自己的spark版本去选择合适的包

使用的话在自己的python脚本里面提交spark任务时候加上:


os.environ["PYSPARK_SUBMIT_ARGS"] = (
"--packages graphframes:graphframes:0.2.0-spark1.6-s_2.10 pyspark-shell"
)

 

 

清楚自己可以调用那些接口

原来我有个毛病,就是啥问题都喜欢搜中文的,结果经常被坑,以后发现对于这种库要去了解,最有效的方式是1.直接看源码接口 2.硬着头皮看官方的英文文档

graphframe里面我们使用方式有:

1.先生成graph对象:


G = graphframe.GraphFrame(verice,edges)

这里有两个变量,一个是顶点dataframe,一个是边dataframe

顶点的格式是:【id,name】

边的格式是【src,dst,”action”】

需要先将数据抽取成上面的格式再传入

 

2.可以调用的方法接口:

outDegree()所有节点的出度

inDegree()所有节点的入度

bsf()宽度优先搜索,查找节点的最短路径

pageRank()按照其他节点指向它的数目来排序,指向一个节点的越多,这个节点就越重要

vertice打印出顶点

edges打印出边

 

具体使用

我们这里只需要计算出入度和出度

所以直接构造顶点和边的dataframe然后输入即可

g = dataframe.GraphFrame(vertices,edges)

g.inDegree()

g.outDegree()

 

 

画图

我们需要将自己的图用一个具体的有向带权图表示出来

这里选用的python的networkx

网上搜的说python里面这个画图不错,但是其实实用一下觉得这个很一般,也就是自己凑合着能看了


import networkx as nx

graph = nx.DiGraph()

graph.add_edges_from(weigth_lsit)(类似{“1”“2”,“权重”})

pos = nx.nx.spring_layout(graph, scale=2, center=(4,5)) # positions for all nodes
# 首先画出节点位置
# nodes
nx.draw_networkx_nodes(graph, pos, node_size=300,node_color='r')
edge_labels = nx.get_edge_attributes(graph,'weight')

# labels标签定义
nx.draw_networkx_labels(graph, pos, font_size=10, font_family='sans-serif', \
horizontalalignment="left")
nx.draw_networkx_edges(graph, pos,alpha=0.5)
nx.draw_networkx_edge_labels(graph,pos,edge_labels = edge_labels,label_pos=0.3)

#nx.graw(graph)
plt.axis('off')
plt.savefig("weighted_graph.png")  # save as png
plt.show()  # display

 

帖张最后的图,我这是网络链接图

图中粗线就是箭头的意思,这个真的只能自己人看看,要高大上的还要另想办法

如果有更好的方法和建议欢迎联系我,多谢指导

点击查看更多spark内容!

Spread the word. Share this post!

Meet The Author

Leave Comment