Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@Orbifold
Last active August 16, 2019 06:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Orbifold/dc85e30ac026682855b20c982d3b109e to your computer and use it in GitHub Desktop.
Save Orbifold/dc85e30ac026682855b20c982d3b109e to your computer and use it in GitHub Desktop.
GraphFrames.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"source": [
"Out of the box the Spark distribution does not contain the GraphFrames package. You simply need to download the jar from [here](https://spark-packages.org/package/graphframes/graphframes) and put it into the `libexec\\jars` directory of the Spark download. Of course, restart the whole lot if already running. Whether the Pypi [GraphFrames](https://github.com/graphframes/graphframes) package for Python is needed is not clear to me."
],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Start Spark in the usual fashion"
],
"metadata": {}
},
{
"cell_type": "code",
"source": [
"import findspark, os\n",
"from pyspark.sql import SparkSession\n",
"from pyspark import SparkContext\n",
"\n",
"os.environ[\"JAVA_HOME\"]=\"/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home\"\n",
"\n",
"print(findspark.find())\n",
"findspark.init()\n",
"\n",
"sc = SparkContext.getOrCreate()\n",
"spark = SparkSession.Builder().appName('GraphFrames').getOrCreate()"
],
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"/usr/local/Cellar/apache-spark/2.4.3/libexec/\n"
]
}
],
"execution_count": 1,
"metadata": {
"collapsed": false,
"outputHidden": false,
"inputHidden": false
}
},
{
"cell_type": "markdown",
"source": [
"and create a standard dataframe for both the nodes and the edges"
],
"metadata": {}
},
{
"cell_type": "code",
"source": [
"from pyspark import SQLContext\n",
"sqlContext = SQLContext(sc)\n",
"nodes = sqlContext.createDataFrame([\n",
" (\"a\", \"Alice\", 34),\n",
" (\"b\", \"Bob\", 36),\n",
" (\"c\", \"Charlie\", 30),\n",
"], [\"id\", \"name\", \"age\"])\n",
"\n",
"edges = sqlContext.createDataFrame([\n",
" (\"a\", \"b\", \"friend\"),\n",
" (\"b\", \"c\", \"follow\"),\n",
" (\"c\", \"b\", \"follow\"),\n",
"], [\"src\", \"dst\", \"relationship\"])\n"
],
"outputs": [],
"execution_count": 2,
"metadata": {
"collapsed": false,
"outputHidden": false,
"inputHidden": false
}
},
{
"cell_type": "markdown",
"source": [
"A graph frame is then simply a combination of these two frames"
],
"metadata": {}
},
{
"cell_type": "code",
"source": [
"from graphframes import *\n",
"g = GraphFrame(nodes, edges)"
],
"outputs": [],
"execution_count": 3,
"metadata": {
"collapsed": false,
"outputHidden": false,
"inputHidden": false
}
},
{
"cell_type": "markdown",
"source": [
"People often wonder whether you can render a GraphFrame graph. This only makes sense if your graph is 'small'. Just like it does not make sense to convert terabyte Spark dataframes to a Panda frame, you should not attempt to think of big-data graph frames as something you can visualize.\n",
"Still, if you want to do it, just take the frame of edges and hand it over to NetworkX."
],
"metadata": {}
},
{
"cell_type": "code",
"source": [
"import networkx as nx\n",
"gp = nx.from_pandas_edgelist(edges.toPandas(),'src','dst')\n",
"nx.draw(gp, with_labels = True)"
],
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": [
"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\n"
]
},
"metadata": {}
}
],
"execution_count": 7,
"metadata": {
"collapsed": false,
"outputHidden": false,
"inputHidden": false
}
},
{
"cell_type": "markdown",
"source": [
"On the analytic side, you can from here on enjoy the whole [GraphFrames API](https://graphframes.github.io/graphframes/docs/_site/api/python/index.html):"
],
"metadata": {}
},
{
"cell_type": "code",
"source": [
"g.inDegrees.show()"
],
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"+---+--------+\n",
"| id|inDegree|\n",
"+---+--------+\n",
"| c| 1|\n",
"| b| 2|\n",
"+---+--------+\n",
"\n"
]
}
],
"execution_count": 8,
"metadata": {
"collapsed": false,
"outputHidden": false,
"inputHidden": false
}
},
{
"cell_type": "markdown",
"source": [
"including the page-rank algorithm"
],
"metadata": {}
},
{
"cell_type": "code",
"source": [
"results = g.pageRank(resetProbability=0.01, maxIter=20)\n",
"results.vertices.select(\"id\", \"pagerank\").show()"
],
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"+-----+--------------------+\n",
"| id| pagerank|\n",
"+-----+--------------------+\n",
"| 14,6| 0.294145761242611|\n",
"| 10,5| 0.2022338632841195|\n",
"| 14,1| 0.07235944148922492|\n",
"| 0,15| 0.03654559907802415|\n",
"| 0,19| 0.03654604538590314|\n",
"| 2,18| 0.10774836041079427|\n",
"|12,17| 1.6440001759095513|\n",
"|10,19| 3.399398634973527|\n",
"| 9,11| 0.543782922230953|\n",
"| 16,2| 0.10746807938250608|\n",
"| 15,8| 0.6612202246354048|\n",
"| 4,8| 0.16755781414237972|\n",
"| 7,8| 0.23648950488934758|\n",
"| 0,12|0.036542159103863825|\n",
"|19,14| 9.203254033641397|\n",
"| 16,9| 0.9285135363356551|\n",
"|19,12| 6.099750937014576|\n",
"| 13,1| 0.07235119679030458|\n",
"| 2,16| 0.10746807938250608|\n",
"| 3,8| 0.13806308065786485|\n",
"+-----+--------------------+\n",
"only showing top 20 rows\n",
"\n"
]
}
],
"execution_count": 39,
"metadata": {
"collapsed": false,
"outputHidden": false,
"inputHidden": false
}
},
{
"cell_type": "markdown",
"source": [
"The results of the pageranking can also be visualized with NetworkX, of course. Note that NetworkX has [its own page-rank algorithm as well](https://networkx.github.io/documentation/networkx-1.10/reference/generated/networkx.algorithms.link_analysis.pagerank_alg.pagerank.html).\n",
"You can generate some predefined graphs via the `example` namespace"
],
"metadata": {}
},
{
"cell_type": "code",
"source": [
"from graphframes.examples import Graphs\n",
"g = Graphs(sqlContext).gridIsingModel(20)"
],
"outputs": [
{
"output_type": "execute_result",
"execution_count": 17,
"data": {
"text/plain": [
"760"
]
},
"metadata": {}
}
],
"execution_count": 17,
"metadata": {
"collapsed": false,
"outputHidden": false,
"inputHidden": false
}
},
{
"cell_type": "markdown",
"source": [
"which looks like this"
],
"metadata": {}
},
{
"cell_type": "code",
"source": [
"gp = nx.from_pandas_edgelist(g.edges.toPandas(),'src','dst')\n",
"nx.draw_spectral(gp, center=[\"2\", \"5\"], scale=3.1)"
],
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"/Users/swa/conda/lib/python3.7/site-packages/networkx/drawing/nx_pylab.py:611: MatplotlibDeprecationWarning: isinstance(..., numbers.Number)\n",
" if cb.is_numlike(alpha):\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
],
"image/png": [
"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\n"
]
},
"metadata": {}
}
],
"execution_count": 38,
"metadata": {
"collapsed": false,
"outputHidden": false,
"inputHidden": false
}
},
{
"cell_type": "markdown",
"source": [
"When all is done, shut down your cluster."
],
"metadata": {}
},
{
"cell_type": "code",
"source": [
"spark.stop()"
],
"outputs": [],
"execution_count": 5,
"metadata": {
"collapsed": false,
"outputHidden": false,
"inputHidden": false
}
},
{
"cell_type": "code",
"source": [],
"outputs": [],
"execution_count": null,
"metadata": {
"collapsed": false,
"outputHidden": false,
"inputHidden": false
}
}
],
"metadata": {
"kernel_info": {
"name": "python3"
},
"language_info": {
"name": "python",
"version": "3.7.2",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"kernelspec": {
"name": "python3",
"language": "python",
"display_name": "Python 3"
},
"nteract": {
"version": "0.14.4"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment