您不能直接将数据框作为参数传递或退出数据框。只有字符串可以通过这种方式传递。-- 你最终做的是退出你的视图模式。
您要执行此操作的方法是将要在笔记本之间传递的 DataFrame 写入 global_temp_view。
完成后,您可以将 temp_view 的名称/位置作为参数传递或将其退出给父级。
这在这里解释得最好(使用示例 1:
https ://docs.databricks.com/notebooks/notebook-workflows.html#pass-structured-data
但是,由于这仅提供退出一个数据帧/temp_view 的指导,我将详细说明您提供的示例。
主要变化是:
- 您退出视图名称而不是数据本身。
- 您只能退出一件事,因此将所有名称作为一个退出。
- For 循环位于父级中,以使用名称从临时视图中读取。
在父级运行子笔记本并将其输出/退出分配给一个变量:
child_output = dbutils.notebook.run(<notebookpath>, timeout, <arguments>)
在孩子:
tempview_list = ["tempView1", "tempView2", "tempView3"]
dbutils.notebook.exit(tempview_list)
数组将作为字符串退出到 child_output 变量中:
"['tempView1', 'tempView2', 'tempView3']"
因此,在父级中,您需要使用 exec() 将字符串转回数组:
exec(f'tempview_list = {child_output}')
现在您已完成此操作,您可以在父笔记本中执行 for 循环:
global_temp_db = spark.conf.get("spark.sql.globalTempDatabase")
for tempview in tempview_list:
exec(f'{tempview}_df = table(global_temp_db + "." + tempview)')
然后,这将根据您的 temp_views 创建 3 个数据帧:tempView1_df、tempView2_df 和 tempView3_df,您可以随心所欲地做任何事情。
我假设您已经从初始数据框中创建了 temp_views,您需要将它们更新为 global_temp_views。