0

我有一个要求,我需要将 pyspark 数据帧作为笔记本参数传递给子笔记本。本质上,子笔记本几乎没有参数类型为数据框的函数来执行某些任务。现在的问题是我无法使用(不将其写入临时目录)将数据框传递给此子笔记本

dbutils.notebook.run(<notebookpath>, timeout, <arguments>)

我尝试引用此 url - 从 databricks 中的另一个笔记本返回数据帧

但是,我仍然有点困惑如何将数据帧从子笔记本返回到父笔记本,以及从父笔记本返回到另一个子笔记本。

我尝试编写如下代码 -

tempview_list = ["tempView1", "tempView2", "tempView3"]
 
for tempview in tempview_list:
  dbutils.notebook.exit(spark.sql(f"Select * from {tempview}"))

但它只是返回第一个 tempView 的模式。

请帮忙。我是pyspark的新手。

谢谢。

4

1 回答 1

0

您不能直接将数据框作为参数传递或退出数据框。只有字符串可以通过这种方式传递。-- 你最终做的是退出你的视图模式。

您要执行此操作的方法是将要在笔记本之间传递的 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。

于 2021-08-31T17:25:04.153 回答