{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "92d192a7",
   "metadata": {},
   "source": [
    "# distrdf001_spark_connection\n",
    "Configure a Spark connection and fill two histograms distributedly.\n",
    "\n",
    "This tutorial shows the ingredients needed to setup the connection to a Spark\n",
    "cluster, namely a SparkConf object holding configuration parameters and a\n",
    "SparkContext object created with the desired options. After this initial\n",
    "setup, an RDataFrame with distributed capabilities is created and connected\n",
    "to the SparkContext instance. Finally, a couple of histograms are drawn from\n",
    "the created columns in the dataset.\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "**Author:** Vincenzo Eduardo Padulano  \n",
    "<i><small>This notebook tutorial was automatically generated with <a href= \"https://github.com/root-project/root/blob/master/documentation/doxygen/converttonotebook.py\">ROOTBOOK-izer</a> from the macro found in the ROOT repository  on Tuesday, May 19, 2026 at 08:10 PM.</small></i>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "dc9ef01a",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:52.082391Z",
     "iopub.status.busy": "2026-05-19T20:10:52.082275Z",
     "iopub.status.idle": "2026-05-19T20:10:53.233852Z",
     "shell.execute_reply": "2026-05-19T20:10:53.233442Z"
    }
   },
   "outputs": [],
   "source": [
    "import pyspark\n",
    "import ROOT"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3007900",
   "metadata": {},
   "source": [
    "Setup the connection to Spark\n",
    "First create a dictionary with keys representing Spark specific configuration\n",
    "parameters. In this tutorial we use the following configuration parameters:\n",
    "\n",
    "    1. spark.app.name: The name of the Spark application\n",
    "    2. spark.master: The Spark endpoint responsible for running the\n",
    "        application. With the syntax \"local[2]\" we signal Spark we want to run\n",
    "        locally on the same machine with 2 cores, each running a separate\n",
    "        process. The default behaviour of a Spark application would run\n",
    "        locally on the same machine with as many concurrent processes as\n",
    "        available cores, that could be also written as \"local[*]\".\n",
    "\n",
    "If you have access to a remote cluster you should substitute the endpoint URL\n",
    "of your Spark master in the form \"spark://HOST:PORT\" in the value of\n",
    "`spark.master`. Depending on the availability of your cluster you may request\n",
    "more computing nodes or cores per node with a similar configuration:\n",
    "\n",
    "    sparkconf = pyspark.SparkConf().setAll(\n",
    "                    {\"spark.master\": \"spark://HOST:PORT\",\n",
    "                     \"spark.executor.instances\": <number_of_nodes>,\n",
    "                     \"spark.executor.cores\" <cores_per_node>,}.items())\n",
    "\n",
    "You can find all configuration options and more details in the official Spark\n",
    "documentation at https://spark.apache.org/docs/latest/configuration.html ."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "30021688",
   "metadata": {},
   "source": [
    "Create a SparkConf object with all the desired Spark configuration parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "59cb75ed",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:53.245118Z",
     "iopub.status.busy": "2026-05-19T20:10:53.244929Z",
     "iopub.status.idle": "2026-05-19T20:10:53.358618Z",
     "shell.execute_reply": "2026-05-19T20:10:53.358124Z"
    }
   },
   "outputs": [],
   "source": [
    "sparkconf = pyspark.SparkConf().setAll(\n",
    "    {\"spark.app.name\": \"distrdf001_spark_connection\",\n",
    "     \"spark.master\": \"local[2]\",\n",
    "     \"spark.driver.memory\": \"4g\"}.items())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8b7c2843",
   "metadata": {},
   "source": [
    "Create a SparkContext with the configuration stored in `sparkconf`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0257b214",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:53.377267Z",
     "iopub.status.busy": "2026-05-19T20:10:53.377125Z",
     "iopub.status.idle": "2026-05-19T20:10:57.193879Z",
     "shell.execute_reply": "2026-05-19T20:10:57.173347Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING: Using incubator modules: jdk.incubator.vector\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using Spark's default log4j profile: org/apache/spark/log4j2-defaults.properties\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting default log level to \"WARN\".\n",
      "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "26/05/19 20:10:54 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n"
     ]
    }
   ],
   "source": [
    "sparkcontext = pyspark.SparkContext(conf=sparkconf)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6d239e52",
   "metadata": {},
   "source": [
    "Create an RDataFrame that will use Spark as a backend for computations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "9cd10e7e",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:57.195911Z",
     "iopub.status.busy": "2026-05-19T20:10:57.195694Z",
     "iopub.status.idle": "2026-05-19T20:10:58.356988Z",
     "shell.execute_reply": "2026-05-19T20:10:58.340743Z"
    }
   },
   "outputs": [],
   "source": [
    "df = ROOT.RDataFrame(1000, executor=sparkcontext)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "90fca4fa",
   "metadata": {},
   "source": [
    "Set the random seed and define two columns of the dataset with random numbers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ed28845e",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:58.397263Z",
     "iopub.status.busy": "2026-05-19T20:10:58.397071Z",
     "iopub.status.idle": "2026-05-19T20:10:58.568038Z",
     "shell.execute_reply": "2026-05-19T20:10:58.557601Z"
    }
   },
   "outputs": [],
   "source": [
    "ROOT.gRandom.SetSeed(1)\n",
    "df_1 = df.Define(\"gaus\", \"gRandom->Gaus(10, 1)\").Define(\"exponential\", \"gRandom->Exp(10)\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "653b093e",
   "metadata": {},
   "source": [
    "Book an histogram for each column"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "e22c541d",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:58.592582Z",
     "iopub.status.busy": "2026-05-19T20:10:58.592396Z",
     "iopub.status.idle": "2026-05-19T20:10:58.730653Z",
     "shell.execute_reply": "2026-05-19T20:10:58.710435Z"
    }
   },
   "outputs": [],
   "source": [
    "h_gaus = df_1.Histo1D((\"gaus\", \"Normal distribution\", 50, 0, 30), \"gaus\")\n",
    "h_exp = df_1.Histo1D((\"exponential\", \"Exponential distribution\", 50, 0, 30), \"exponential\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "91f94090",
   "metadata": {},
   "source": [
    "Plot the histograms side by side on a canvas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "efe88335",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:10:58.758515Z",
     "iopub.status.busy": "2026-05-19T20:10:58.758342Z",
     "iopub.status.idle": "2026-05-19T20:11:05.765785Z",
     "shell.execute_reply": "2026-05-19T20:11:05.753628Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<cppyy.gbl.TH1D object at 0x5640311f73e0>"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c = ROOT.TCanvas(\"distrdf001\", \"distrdf001\", 800, 400)\n",
    "c.Divide(2, 1)\n",
    "c.cd(1)\n",
    "h_gaus.DrawCopy()\n",
    "c.cd(2)\n",
    "h_exp.DrawCopy()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fc47b5fc",
   "metadata": {},
   "source": [
    "Save the canvas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "6f2ed46c",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:05.790328Z",
     "iopub.status.busy": "2026-05-19T20:11:05.790162Z",
     "iopub.status.idle": "2026-05-19T20:11:05.987926Z",
     "shell.execute_reply": "2026-05-19T20:11:05.976741Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Info in <TCanvas::Print>: png file distrdf001_spark_connection.png has been created\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Saved figure to distrdf001_spark_connection.png\n"
     ]
    }
   ],
   "source": [
    "c.SaveAs(\"distrdf001_spark_connection.png\")\n",
    "print(\"Saved figure to distrdf001_spark_connection.png\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a10e2301",
   "metadata": {},
   "source": [
    "Draw all canvases "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b6f635d9",
   "metadata": {
    "collapsed": false,
    "execution": {
     "iopub.execute_input": "2026-05-19T20:11:06.014745Z",
     "iopub.status.busy": "2026-05-19T20:11:06.014551Z",
     "iopub.status.idle": "2026-05-19T20:11:06.227815Z",
     "shell.execute_reply": "2026-05-19T20:11:06.217228Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "\n",
       "<div id=\"root_plot_1779221466195\" style=\"width: 800px; height: 400px; position: relative\">\n",
       "</div>\n",
       "\n",
       "</div>\n",
       "<script>\n",
       "   function process_root_plot_1779221466195() {\n",
       "      function execCode(Core) {\n",
       "         Core.settings.HandleKeys = false;\n",
       "         \n",
       "Core.unzipJSON(30937,'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').then(json => {\n",
       "   const obj = Core.parse(json);\n",
       "   Core.draw('root_plot_1779221466195', obj, '');\n",
       "});\n",
       "\n",
       "      }\n",
       "      const servers = ['/static/', 'https://root.cern/js/7.11.0/', 'https://jsroot.gsi.de/7.11.0/'],\n",
       "            path = 'build/jsroot';\n",
       "      if (typeof JSROOT !== 'undefined')\n",
       "         execCode(JSROOT);\n",
       "      else if (typeof requirejs !== 'undefined') {\n",
       "         servers.forEach((s,i) => { servers[i] = s + path; });\n",
       "         requirejs.config({ paths: { 'jsroot' : servers } })(['jsroot'],  execCode);\n",
       "      } else {\n",
       "         const config = document.getElementById('jupyter-config-data');\n",
       "         if (config)\n",
       "            servers[0] = (JSON.parse(config.innerHTML || '{}')?.baseUrl || '/') + 'static/';\n",
       "         else\n",
       "            servers.shift();\n",
       "         function loadJsroot() {\n",
       "            return !servers.length ? 0 : import(servers.shift() + path + '.js').catch(loadJsroot).then(() => execCode(JSROOT));\n",
       "         }\n",
       "         loadJsroot();\n",
       "      }\n",
       "   }\n",
       "   process_root_plot_1779221466195();\n",
       "</script>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from ROOT import gROOT \n",
    "gROOT.GetListOfCanvases().Draw()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
