如何在数据块中将数据框作为笔记本参数传递?

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 运气好吗?

以上是关于如何在数据块中将数据框作为笔记本参数传递?的主要内容,如果未能解决你的问题,请参考以下文章

如何在用户定义的函数中将数据库列作为参数传递?

在 UDF 正文中将列作为参数传递

如何在 API 调用中将输入值作为参数传递?

如何在 BLToolkit 中将 DataTable 作为参数传递?

如何在 PLSQL 过程中将绑定变量作为 IN OUT 参数传递

如何在Laravel 5.2中将表单数据作为路由参数传递