3 pyspark spark-notebook databricks azure-notebooks azure-databricks
我有一个要求,其中我需要将 pyspark 数据帧作为笔记本参数传递给子笔记本。本质上,子笔记本几乎没有以参数类型作为数据帧的函数来执行某些任务。现在的问题是我无法使用(不将其写入临时目录)将数据帧传递到该子笔记本
dbutils.notebook.run(<notebookpath>, timeout, <arguments>)
Run Code Online (Sandbox Code Playgroud)
我尝试引用此网址 - 从 databricks 中的另一个笔记本返回数据框
但是,我仍然有点困惑如何将数据帧从子笔记本返回到父笔记本,以及从父笔记本返回到另一个子笔记本。
我尝试编写如下代码 -
tempview_list = ["tempView1", "tempView2", "tempView3"]
for tempview in tempview_list:
dbutils.notebook.exit(spark.sql(f"Select * from {tempview}"))
Run Code Online (Sandbox Code Playgroud)
但它只是返回第一个 tempView 的架构。
请帮忙。我是 pyspark 的新手。
谢谢。
小智 5
您不能直接将数据帧作为参数传递或退出数据帧。只有字符串可以通过这种方式传递。-- 您最终所做的是退出视图模式。
您想要执行此操作的方法是将要在笔记本之间传递的 DataFrame 写入 global_temp_view 中。
完成此操作后,您可以将 temp_view 的名称/位置作为参数传递或将其退出到父级。
这在这里解释得最好(使用示例 1: https ://docs.databricks.com/notebooks/notebook-workflows.html#pass-structed-data
然而,由于这仅提供有关退出一个数据帧/temp_view 的指导,我将详细说明您提供的示例。
主要变化是:
在父笔记本中运行子笔记本并将其输出/退出分配给变量:
child_output = dbutils.notebook.run(<notebookpath>, timeout, <arguments>)
Run Code Online (Sandbox Code Playgroud)
在儿童中:
tempview_list = ["tempView1", "tempView2", "tempView3"]
dbutils.notebook.exit(tempview_list)
Run Code Online (Sandbox Code Playgroud)
该数组将作为字符串退出到 child_output 变量中:
"['tempView1', 'tempView2', 'tempView3']"
Run Code Online (Sandbox Code Playgroud)
因此,在父级中,您需要使用 exec() 将字符串转回数组:
exec(f'tempview_list = {child_output}')
Run Code Online (Sandbox Code Playgroud)
现在您已经完成了此操作,您可以在父笔记本中执行 for 循环:
global_temp_db = spark.conf.get("spark.sql.globalTempDatabase")
for tempview in tempview_list:
exec(f'{tempview}_df = table(global_temp_db + "." + tempview)')
Run Code Online (Sandbox Code Playgroud)
然后,这将根据您的 temp_views 创建 3 个数据帧:tempView1_df、tempView2_df 和 tempView3_df,您可以使用它们执行任何操作。
我假设您已经从初始数据帧创建了 temp_views,您需要将它们更新为 global_temp_views。
| 归档时间: |
|
| 查看次数: |
6884 次 |
| 最近记录: |