<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Get Job Run output through Rest API call in Data Engineering</title>
    <link>https://community.databricks.com/t5/data-engineering/get-job-run-output-through-rest-api-call/m-p/122144#M46673</link>
    <description>&lt;P&gt;I have a simple notebook reading a dataframe as input and returning another dataframe, which is as follows:&lt;BR /&gt;&lt;/P&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&lt;BR /&gt;from&lt;/SPAN&gt;&lt;SPAN&gt; pyspark.sql &lt;/SPAN&gt;&lt;SPAN&gt;import&lt;/SPAN&gt;&lt;SPAN&gt; SparkSession&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;import&lt;/SPAN&gt;&lt;SPAN&gt; pandas &lt;/SPAN&gt;&lt;SPAN&gt;as&lt;/SPAN&gt;&lt;SPAN&gt; pd, json&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;spark &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; SparkSession.builder \&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; .&lt;/SPAN&gt;&lt;SPAN&gt;appName&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"Pandas to Spark DataFrame Conversion"&lt;/SPAN&gt;&lt;SPAN&gt;) \&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; .&lt;/SPAN&gt;&lt;SPAN&gt;getOrCreate&lt;/SPAN&gt;&lt;SPAN&gt;()&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;dbutils.widgets.&lt;/SPAN&gt;&lt;SPAN&gt;text&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"dataframe_json"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;""&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;dataframe_json &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; dbutils.widgets.&lt;/SPAN&gt;&lt;SPAN&gt;get&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"dataframe_json"&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;user_dataframe &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; pd.&lt;/SPAN&gt;&lt;SPAN&gt;read_json&lt;/SPAN&gt;&lt;SPAN&gt;(dataframe_json, &lt;/SPAN&gt;&lt;SPAN&gt;orient&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;'split'&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;res &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;None&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;def&lt;/SPAN&gt; &lt;SPAN&gt;process_dataframe&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;df&lt;/SPAN&gt;&lt;SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;# Example transformation&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; spark_df &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; spark.&lt;/SPAN&gt;&lt;SPAN&gt;createDataFrame&lt;/SPAN&gt;&lt;SPAN&gt;(df)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; spark_df &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; spark_df.&lt;/SPAN&gt;&lt;SPAN&gt;withColumn&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"new_column"&lt;/SPAN&gt;&lt;SPAN&gt;, spark_df[spark_df.columns[&lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;]] &lt;/SPAN&gt;&lt;SPAN&gt;*&lt;/SPAN&gt; &lt;SPAN&gt;2&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;return&lt;/SPAN&gt;&lt;SPAN&gt; spark_df &amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;try&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; user_dataframe &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; pd.&lt;/SPAN&gt;&lt;SPAN&gt;read_json&lt;/SPAN&gt;&lt;SPAN&gt;(dataframe_json, &lt;/SPAN&gt;&lt;SPAN&gt;orient&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;'split'&lt;/SPAN&gt;&lt;SPAN&gt;) &amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;print&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"DataFrame reconstructed successfully:"&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;print&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;'1'&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;except&lt;/SPAN&gt; &lt;SPAN&gt;ValueError&lt;/SPAN&gt; &lt;SPAN&gt;as&lt;/SPAN&gt;&lt;SPAN&gt; e:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;print&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"Failed to reconstruct DataFrame:"&lt;/SPAN&gt;&lt;SPAN&gt;, e)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; res &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;SPAN&gt;"error"&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;str&lt;/SPAN&gt;&lt;SPAN&gt;(e)}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;if&lt;/SPAN&gt; &lt;SPAN&gt;not&lt;/SPAN&gt;&lt;SPAN&gt; res &lt;/SPAN&gt;&lt;SPAN&gt;is&lt;/SPAN&gt; &lt;SPAN&gt;None&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; dbutils.notebook.&lt;/SPAN&gt;&lt;SPAN&gt;exit&lt;/SPAN&gt;&lt;SPAN&gt;(res)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;try&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; result &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;process_dataframe&lt;/SPAN&gt;&lt;SPAN&gt;(user_dataframe)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; result_json &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; [row.&lt;/SPAN&gt;&lt;SPAN&gt;asDict&lt;/SPAN&gt;&lt;SPAN&gt;() &lt;/SPAN&gt;&lt;SPAN&gt;for&lt;/SPAN&gt;&lt;SPAN&gt; row &lt;/SPAN&gt;&lt;SPAN&gt;in&lt;/SPAN&gt;&lt;SPAN&gt; result.&lt;/SPAN&gt;&lt;SPAN&gt;collect&lt;/SPAN&gt;&lt;SPAN&gt;()]&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; res &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; json.&lt;/SPAN&gt;&lt;SPAN&gt;dumps&lt;/SPAN&gt;&lt;SPAN&gt;({&lt;/SPAN&gt;&lt;SPAN&gt;"result"&lt;/SPAN&gt;&lt;SPAN&gt;: result_json})&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;except&lt;/SPAN&gt; &lt;SPAN&gt;Exception&lt;/SPAN&gt; &lt;SPAN&gt;as&lt;/SPAN&gt;&lt;SPAN&gt; e:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; res &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; json.&lt;/SPAN&gt;&lt;SPAN&gt;dumps&lt;/SPAN&gt;&lt;SPAN&gt;({&lt;/SPAN&gt;&lt;SPAN&gt;"error"&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;str&lt;/SPAN&gt;&lt;SPAN&gt;(e)})&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;dbutils.notebook.&lt;/SPAN&gt;&lt;SPAN&gt;exit&lt;/SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;(res)&lt;BR /&gt;&lt;BR /&gt;The notebook is run by a job that takes a dataframe as input, passes it to the notebook - no problem so far-. I run the notebook via an API call as follows:&lt;BR /&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;P&gt;def run_job():&lt;BR /&gt;import requests&lt;BR /&gt;import json&lt;BR /&gt;import pandas as pd, time&lt;BR /&gt;&lt;BR /&gt;df = pd.DataFrame({&lt;BR /&gt;'Column1': [1, 2, 3],&lt;BR /&gt;'Column2': ['D', 'E', 'C']})&lt;/P&gt;&lt;P&gt;# Serialize the DataFrame to JSON&lt;BR /&gt;df_json = df.to_json(orient='split')&lt;BR /&gt;&lt;BR /&gt;# Configuration&lt;BR /&gt;DATABRICKS_INSTANCE = "&lt;A href="https://adb-my_session.azuredatabricks.net" target="_blank"&gt;https://adb-my_session.azuredatabricks.net&lt;/A&gt;"&lt;BR /&gt;TOKEN = "my_token"&lt;BR /&gt;CLUSTER_ID = "my_cluser"&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;# Headers for authentication&lt;BR /&gt;headers = {&lt;BR /&gt;"Authorization": f"Bearer {TOKEN}",&lt;BR /&gt;"Content-Type": "application/json"&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;job_payload = {&lt;BR /&gt;"run_name": "Run Notebook via API",&lt;BR /&gt;"existing_cluster_id": CLUSTER_ID,&lt;BR /&gt;'job_id': 'my_job_id',&lt;BR /&gt;"job_parameters": {'dataframe_json': df_json}&lt;BR /&gt;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;response = requests.post(&lt;BR /&gt;f"{DATABRICKS_INSTANCE}/api/2.2/jobs/run-now",&lt;BR /&gt;headers=headers,&lt;BR /&gt;data=json.dumps(job_payload),&lt;BR /&gt;verify = False&lt;BR /&gt;)&lt;BR /&gt;&lt;BR /&gt;if response.status_code == 200:&lt;BR /&gt;run_id = response.json()["run_id"]&lt;BR /&gt;# Wait for the run to complete&lt;BR /&gt;while True:&lt;BR /&gt;response = requests.get(&lt;BR /&gt;f"{DATABRICKS_INSTANCE}/api/2.2/jobs/runs/get",&lt;BR /&gt;headers=headers,&lt;BR /&gt;params={"run_id": run_id, 'include_output': 'true'},&lt;BR /&gt;verify=False)&lt;BR /&gt;&lt;BR /&gt;output_format = 'JSON'&lt;BR /&gt;body = {&lt;BR /&gt;"run_id": run_id,&lt;BR /&gt;"output_format": output_format&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;response = requests.get(&lt;BR /&gt;f"{DATABRICKS_INSTANCE}/api/2.2/jobs/runs/get-output",&lt;BR /&gt;headers=headers,&lt;BR /&gt;json=body,&lt;BR /&gt;verify=False&lt;BR /&gt;)&lt;BR /&gt;if response.status_code == 200:&lt;BR /&gt;state = response.json()["state"]["life_cycle_state"]&lt;BR /&gt;if state == "TERMINATED":&lt;BR /&gt;output = response.json()['output']&lt;BR /&gt;if "result" in output:&lt;BR /&gt;print("Result:", output["result"])&lt;BR /&gt;elif "error" in output:&lt;BR /&gt;print("Error:", output["error"])&lt;BR /&gt;break&lt;BR /&gt;elif state == "INTERNAL_ERROR":&lt;BR /&gt;print("Internal error:", response.json()["state"]["state_message"])&lt;BR /&gt;break&lt;BR /&gt;time.sleep(10)&lt;BR /&gt;else:&lt;BR /&gt;print("Error submitting job:", response.text)&lt;/P&gt;&lt;SPAN&gt;&lt;BR /&gt;The run-now entry point returns HTTP 200 works.&lt;BR /&gt;The get entry point returns HTTP 200 and works and returns among other:&amp;nbsp;'status': {'state': 'TERMINATED', 'termination_details': {'code': 'SUCCESS', 'type': 'SUCCESS', 'message': ''}}&lt;BR /&gt;The get-output entry point returns HTTP 400 with the following content:&lt;BR /&gt;{'error_code': 'INVALID_PARAMETER_VALUE', 'message': 'Retrieving the output of runs with multiple tasks is not supported. Please retrieve the output of each individual task run instead.', 'details': [{'@type': 'type.googleapis.com/google.rpc.RequestInfo', 'request_id': '512da231-ef1b-4d82-bd7e-8dae326a6356', 'serving_data': ''}]}&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
    <pubDate>Wed, 18 Jun 2025 15:34:53 GMT</pubDate>
    <dc:creator>Alex79</dc:creator>
    <dc:date>2025-06-18T15:34:53Z</dc:date>
    <item>
      <title>Get Job Run output through Rest API call</title>
      <link>https://community.databricks.com/t5/data-engineering/get-job-run-output-through-rest-api-call/m-p/122144#M46673</link>
      <description>&lt;P&gt;I have a simple notebook reading a dataframe as input and returning another dataframe, which is as follows:&lt;BR /&gt;&lt;/P&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&lt;BR /&gt;from&lt;/SPAN&gt;&lt;SPAN&gt; pyspark.sql &lt;/SPAN&gt;&lt;SPAN&gt;import&lt;/SPAN&gt;&lt;SPAN&gt; SparkSession&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;import&lt;/SPAN&gt;&lt;SPAN&gt; pandas &lt;/SPAN&gt;&lt;SPAN&gt;as&lt;/SPAN&gt;&lt;SPAN&gt; pd, json&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;spark &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; SparkSession.builder \&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; .&lt;/SPAN&gt;&lt;SPAN&gt;appName&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"Pandas to Spark DataFrame Conversion"&lt;/SPAN&gt;&lt;SPAN&gt;) \&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; .&lt;/SPAN&gt;&lt;SPAN&gt;getOrCreate&lt;/SPAN&gt;&lt;SPAN&gt;()&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;dbutils.widgets.&lt;/SPAN&gt;&lt;SPAN&gt;text&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"dataframe_json"&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;""&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;dataframe_json &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; dbutils.widgets.&lt;/SPAN&gt;&lt;SPAN&gt;get&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"dataframe_json"&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;user_dataframe &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; pd.&lt;/SPAN&gt;&lt;SPAN&gt;read_json&lt;/SPAN&gt;&lt;SPAN&gt;(dataframe_json, &lt;/SPAN&gt;&lt;SPAN&gt;orient&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;'split'&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;res &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;None&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;def&lt;/SPAN&gt; &lt;SPAN&gt;process_dataframe&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;df&lt;/SPAN&gt;&lt;SPAN&gt;&lt;span class="lia-unicode-emoji" title=":disappointed_face:"&gt;😞&lt;/span&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;# Example transformation&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; spark_df &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; spark.&lt;/SPAN&gt;&lt;SPAN&gt;createDataFrame&lt;/SPAN&gt;&lt;SPAN&gt;(df)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; spark_df &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; spark_df.&lt;/SPAN&gt;&lt;SPAN&gt;withColumn&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"new_column"&lt;/SPAN&gt;&lt;SPAN&gt;, spark_df[spark_df.columns[&lt;/SPAN&gt;&lt;SPAN&gt;0&lt;/SPAN&gt;&lt;SPAN&gt;]] &lt;/SPAN&gt;&lt;SPAN&gt;*&lt;/SPAN&gt; &lt;SPAN&gt;2&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;return&lt;/SPAN&gt;&lt;SPAN&gt; spark_df &amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;try&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; user_dataframe &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; pd.&lt;/SPAN&gt;&lt;SPAN&gt;read_json&lt;/SPAN&gt;&lt;SPAN&gt;(dataframe_json, &lt;/SPAN&gt;&lt;SPAN&gt;orient&lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt;'split'&lt;/SPAN&gt;&lt;SPAN&gt;) &amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;print&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"DataFrame reconstructed successfully:"&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;print&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;'1'&lt;/SPAN&gt;&lt;SPAN&gt;)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;except&lt;/SPAN&gt; &lt;SPAN&gt;ValueError&lt;/SPAN&gt; &lt;SPAN&gt;as&lt;/SPAN&gt;&lt;SPAN&gt; e:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;SPAN&gt;print&lt;/SPAN&gt;&lt;SPAN&gt;(&lt;/SPAN&gt;&lt;SPAN&gt;"Failed to reconstruct DataFrame:"&lt;/SPAN&gt;&lt;SPAN&gt;, e)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; res &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; {&lt;/SPAN&gt;&lt;SPAN&gt;"error"&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;str&lt;/SPAN&gt;&lt;SPAN&gt;(e)}&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;if&lt;/SPAN&gt; &lt;SPAN&gt;not&lt;/SPAN&gt;&lt;SPAN&gt; res &lt;/SPAN&gt;&lt;SPAN&gt;is&lt;/SPAN&gt; &lt;SPAN&gt;None&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; dbutils.notebook.&lt;/SPAN&gt;&lt;SPAN&gt;exit&lt;/SPAN&gt;&lt;SPAN&gt;(res)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;try&lt;/SPAN&gt;&lt;SPAN&gt;:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; result &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt; &lt;SPAN&gt;process_dataframe&lt;/SPAN&gt;&lt;SPAN&gt;(user_dataframe)&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; result_json &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; [row.&lt;/SPAN&gt;&lt;SPAN&gt;asDict&lt;/SPAN&gt;&lt;SPAN&gt;() &lt;/SPAN&gt;&lt;SPAN&gt;for&lt;/SPAN&gt;&lt;SPAN&gt; row &lt;/SPAN&gt;&lt;SPAN&gt;in&lt;/SPAN&gt;&lt;SPAN&gt; result.&lt;/SPAN&gt;&lt;SPAN&gt;collect&lt;/SPAN&gt;&lt;SPAN&gt;()]&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; res &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; json.&lt;/SPAN&gt;&lt;SPAN&gt;dumps&lt;/SPAN&gt;&lt;SPAN&gt;({&lt;/SPAN&gt;&lt;SPAN&gt;"result"&lt;/SPAN&gt;&lt;SPAN&gt;: result_json})&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;except&lt;/SPAN&gt; &lt;SPAN&gt;Exception&lt;/SPAN&gt; &lt;SPAN&gt;as&lt;/SPAN&gt;&lt;SPAN&gt; e:&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; res &lt;/SPAN&gt;&lt;SPAN&gt;=&lt;/SPAN&gt;&lt;SPAN&gt; json.&lt;/SPAN&gt;&lt;SPAN&gt;dumps&lt;/SPAN&gt;&lt;SPAN&gt;({&lt;/SPAN&gt;&lt;SPAN&gt;"error"&lt;/SPAN&gt;&lt;SPAN&gt;: &lt;/SPAN&gt;&lt;SPAN&gt;str&lt;/SPAN&gt;&lt;SPAN&gt;(e)})&lt;/SPAN&gt;&lt;/DIV&gt;&lt;BR /&gt;&lt;DIV&gt;&lt;SPAN&gt;dbutils.notebook.&lt;/SPAN&gt;&lt;SPAN&gt;exit&lt;/SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;(res)&lt;BR /&gt;&lt;BR /&gt;The notebook is run by a job that takes a dataframe as input, passes it to the notebook - no problem so far-. I run the notebook via an API call as follows:&lt;BR /&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;P&gt;def run_job():&lt;BR /&gt;import requests&lt;BR /&gt;import json&lt;BR /&gt;import pandas as pd, time&lt;BR /&gt;&lt;BR /&gt;df = pd.DataFrame({&lt;BR /&gt;'Column1': [1, 2, 3],&lt;BR /&gt;'Column2': ['D', 'E', 'C']})&lt;/P&gt;&lt;P&gt;# Serialize the DataFrame to JSON&lt;BR /&gt;df_json = df.to_json(orient='split')&lt;BR /&gt;&lt;BR /&gt;# Configuration&lt;BR /&gt;DATABRICKS_INSTANCE = "&lt;A href="https://adb-my_session.azuredatabricks.net" target="_blank"&gt;https://adb-my_session.azuredatabricks.net&lt;/A&gt;"&lt;BR /&gt;TOKEN = "my_token"&lt;BR /&gt;CLUSTER_ID = "my_cluser"&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;# Headers for authentication&lt;BR /&gt;headers = {&lt;BR /&gt;"Authorization": f"Bearer {TOKEN}",&lt;BR /&gt;"Content-Type": "application/json"&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;job_payload = {&lt;BR /&gt;"run_name": "Run Notebook via API",&lt;BR /&gt;"existing_cluster_id": CLUSTER_ID,&lt;BR /&gt;'job_id': 'my_job_id',&lt;BR /&gt;"job_parameters": {'dataframe_json': df_json}&lt;BR /&gt;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;response = requests.post(&lt;BR /&gt;f"{DATABRICKS_INSTANCE}/api/2.2/jobs/run-now",&lt;BR /&gt;headers=headers,&lt;BR /&gt;data=json.dumps(job_payload),&lt;BR /&gt;verify = False&lt;BR /&gt;)&lt;BR /&gt;&lt;BR /&gt;if response.status_code == 200:&lt;BR /&gt;run_id = response.json()["run_id"]&lt;BR /&gt;# Wait for the run to complete&lt;BR /&gt;while True:&lt;BR /&gt;response = requests.get(&lt;BR /&gt;f"{DATABRICKS_INSTANCE}/api/2.2/jobs/runs/get",&lt;BR /&gt;headers=headers,&lt;BR /&gt;params={"run_id": run_id, 'include_output': 'true'},&lt;BR /&gt;verify=False)&lt;BR /&gt;&lt;BR /&gt;output_format = 'JSON'&lt;BR /&gt;body = {&lt;BR /&gt;"run_id": run_id,&lt;BR /&gt;"output_format": output_format&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;response = requests.get(&lt;BR /&gt;f"{DATABRICKS_INSTANCE}/api/2.2/jobs/runs/get-output",&lt;BR /&gt;headers=headers,&lt;BR /&gt;json=body,&lt;BR /&gt;verify=False&lt;BR /&gt;)&lt;BR /&gt;if response.status_code == 200:&lt;BR /&gt;state = response.json()["state"]["life_cycle_state"]&lt;BR /&gt;if state == "TERMINATED":&lt;BR /&gt;output = response.json()['output']&lt;BR /&gt;if "result" in output:&lt;BR /&gt;print("Result:", output["result"])&lt;BR /&gt;elif "error" in output:&lt;BR /&gt;print("Error:", output["error"])&lt;BR /&gt;break&lt;BR /&gt;elif state == "INTERNAL_ERROR":&lt;BR /&gt;print("Internal error:", response.json()["state"]["state_message"])&lt;BR /&gt;break&lt;BR /&gt;time.sleep(10)&lt;BR /&gt;else:&lt;BR /&gt;print("Error submitting job:", response.text)&lt;/P&gt;&lt;SPAN&gt;&lt;BR /&gt;The run-now entry point returns HTTP 200 works.&lt;BR /&gt;The get entry point returns HTTP 200 and works and returns among other:&amp;nbsp;'status': {'state': 'TERMINATED', 'termination_details': {'code': 'SUCCESS', 'type': 'SUCCESS', 'message': ''}}&lt;BR /&gt;The get-output entry point returns HTTP 400 with the following content:&lt;BR /&gt;{'error_code': 'INVALID_PARAMETER_VALUE', 'message': 'Retrieving the output of runs with multiple tasks is not supported. Please retrieve the output of each individual task run instead.', 'details': [{'@type': 'type.googleapis.com/google.rpc.RequestInfo', 'request_id': '512da231-ef1b-4d82-bd7e-8dae326a6356', 'serving_data': ''}]}&lt;BR /&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;SPAN&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Wed, 18 Jun 2025 15:34:53 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/get-job-run-output-through-rest-api-call/m-p/122144#M46673</guid>
      <dc:creator>Alex79</dc:creator>
      <dc:date>2025-06-18T15:34:53Z</dc:date>
    </item>
    <item>
      <title>Re: Get Job Run output through Rest API call</title>
      <link>https://community.databricks.com/t5/data-engineering/get-job-run-output-through-rest-api-call/m-p/122205#M46697</link>
      <description>&lt;P&gt;Hi team,&lt;/P&gt;&lt;P&gt;{&lt;BR /&gt;"error_code": "INVALID_PARAMETER_VALUE",&lt;BR /&gt;"message": "Retrieving the output of runs with multiple tasks is not supported..."&lt;BR /&gt;}&lt;BR /&gt;means the job you're triggering (job_id = 'my_job_id') is a multi-task job (even if it has only one task). In such cases, jobs/runs/get-output only works on task-level run IDs, not the top-level job run ID.&lt;/P&gt;&lt;P&gt;Solution:&lt;BR /&gt;1. To get the output from a specific task within the job: Get the run_id from the jobs/run-now response.&lt;BR /&gt;2. Call /api/2.1/jobs/runs/get with that run_id.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 19 Jun 2025 06:45:12 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/get-job-run-output-through-rest-api-call/m-p/122205#M46697</guid>
      <dc:creator>Vidhi_Khaitan</dc:creator>
      <dc:date>2025-06-19T06:45:12Z</dc:date>
    </item>
    <item>
      <title>Re: Get Job Run output through Rest API call</title>
      <link>https://community.databricks.com/t5/data-engineering/get-job-run-output-through-rest-api-call/m-p/122222#M46705</link>
      <description>&lt;P&gt;Thanks Vidhi. Attached is the response I get when using api/2.1/jobs/get:&lt;/P&gt;&lt;P&gt;I still don't get the result from the notebooko processing, whereas clearly, it worked (see second capture 'output').&lt;/P&gt;&lt;P&gt;How / where can I get the result back?.&lt;/P&gt;&lt;P&gt;Btw, is it expected that I cannot do a copy and paste into these messages? This is super complicated to provide the relevant information without this functionality.&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Capture.JPG" style="width: 400px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/17635iF4B23D5232D2EC0E/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Capture.JPG" alt="Capture.JPG" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Output.JPG" style="width: 400px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/17634i54FB67C58E425ACE/image-size/medium?v=v2&amp;amp;px=400" role="button" title="Output.JPG" alt="Output.JPG" /&gt;&lt;/span&gt;&lt;/P&gt;&lt;P&gt;  &lt;/P&gt;</description>
      <pubDate>Thu, 19 Jun 2025 08:26:20 GMT</pubDate>
      <guid>https://community.databricks.com/t5/data-engineering/get-job-run-output-through-rest-api-call/m-p/122222#M46705</guid>
      <dc:creator>Alex79</dc:creator>
      <dc:date>2025-06-19T08:26:20Z</dc:date>
    </item>
  </channel>
</rss>

