从 databricks 中的另一个笔记本返回数据帧

Mah*_*ahi 5 pyspark databricks azure-databricks

我有一个笔记本,它将处理该文件并以结构化格式创建数据框。现在我需要导入在另一个笔记本中创建的数据框,但问题是在运行笔记本之前我需要验证仅适用于我需要运行的某些场景。

通常要导入所有数据结构,我们使用%run。但就我而言,它应该是 if 子句和 then notebook run 的组合

if "dataset" in path": %run ntbk_path

它给出错误“路径不存在”

if "dataset" in path": dbutils.notebook.run(ntbk_path)

这个我无法获得所有的数据结构。

有人可以帮我解决这个错误吗?

Ale*_*Ott 9

要正确实施它,您需要了解事物是如何工作的:

  • %run是一个单独的指令,应该放入单独的笔记本单元中,不能将其与 Python 代码混合。另外,它不能接受笔记本名称作为变量。%run正在做什么-它正在当前 Spark 会话的上下文中评估指定笔记本中的代码,因此该笔记本中定义的所有内容 - 变量、函数等都可以在调用者笔记本中使用。
  • dbutils.notebook.run是一个函数,它可以采用笔记本路径加上参数并将其作为当前集群上的单独作业执行。因为它是作为一个单独的作业执行的,所以它不会与当前笔记本共享上下文,并且其中定义的所有内容在调用者笔记本中都将不可用(您可以返回一个简单的字符串作为执行结果,但它有相对较小的最大长度)。问题之一dbutils.notebook.run是,即使代码非常简单,作业的调度也需要几秒钟的时间。

如何实现您所需要的?

  • 如果你使用dbutils.notebook.run,那么在被调用的笔记本中你可以注册一个临时视图,调用者笔记本可以从中读取数据(示例取自本演示

称为笔记本(Code1- 它需要两个参数 -name用于视图名称和n- 用于生成的条目数):

name = dbutils.widgets.get("name")
n = int(dbutils.widgets.get("n"))
df = spark.range(0, n)
df.createOrReplaceTempView(name)
Run Code Online (Sandbox Code Playgroud)

来电笔记本(我们称之为main):

if "dataset" in "path": 
  view_name = "some_name"
  dbutils.notebook.run(ntbk_path, 300, {'name': view_name, 'n': "1000"})
  df = spark.sql(f"select * from {view_name}")
  ... work with data
Run Code Online (Sandbox Code Playgroud)
  • 甚至可以做类似 with 的事情%run,但它可能需要一种“魔法”。它的基础是您可以使用 向被调用的笔记本传递参数$arg_name="value",甚至可以引用小部件中指定的值。但无论如何,值的检查都会在被调用的笔记本中进行。

被调用的笔记本可能如下所示:

if "dataset" in "path": 
  view_name = "some_name"
  dbutils.notebook.run(ntbk_path, 300, {'name': view_name, 'n': "1000"})
  df = spark.sql(f"select * from {view_name}")
  ... work with data
Run Code Online (Sandbox Code Playgroud)

呼叫者笔记本可能如下所示:

------ cell in python
if "dataset" in "path": 
  gen_data = "true"
else:
  gen_data = "false"
dbutils.widgets.text("gen_data", gen_data)

------- cell for %run
%run ./notebook_name $generate_data=$gen_data

------ again in python
dbutils.widgets.remove("gen_data") # remove widget
if dataframe: # dataframe is defined
  do something with dataframe
Run Code Online (Sandbox Code Playgroud)