如何在数据块中将数据框作为笔记本参数传递?
Posted
技术标签:
【中文标题】如何在数据块中将数据框作为笔记本参数传递?【英文标题】:How to pass a dataframe as notebook parameter in databricks? 【发布时间】:2021-08-30 14:29:30 【问题描述】:我有一个要求,我需要将 pyspark 数据帧作为笔记本参数传递给子笔记本。本质上,子笔记本几乎没有参数类型为数据框的函数来执行某些任务。现在的问题是我无法使用 (不将其写入临时目录)
dbutils.notebook.run(<notebookpath>, timeout, <arguments>)
我尝试引用此网址 - Return a dataframe from another notebook in databricks
但是,我仍然有点困惑,如何将数据帧从子笔记本返回到父笔记本,以及从父笔记本返回到另一个子笔记本。
我尝试编写如下代码 -
tempview_list = ["tempView1", "tempView2", "tempView3"]
for tempview in tempview_list:
dbutils.notebook.exit(spark.sql(f"Select * from tempview"))
但它只是返回第一个 tempView 的架构。
请帮忙。我是 pyspark 的新手。
谢谢。
【问题讨论】:
【参考方案1】:您不能直接将数据框作为参数传递或退出数据框。 这种方式只能传递字符串。 -- 你最终做的是退出你的视图模式。
您想要执行此操作的方式是将要在笔记本之间传递的 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。
【讨论】:
谢谢莱斯特。我会试试这个方法 @dexter48 运气好吗?以上是关于如何在数据块中将数据框作为笔记本参数传递?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 BLToolkit 中将 DataTable 作为参数传递?