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

Posted

技术标签:

【中文标题】从数据块中的另一个笔记本返回数据帧【英文标题】:Return a dataframe from another notebook in databricks 【发布时间】:2021-07-06 14:43:05 【问题描述】:

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

通常要导入所有数据结构,我们使用 %run。但在我的情况下,它应该是 if 子句的组合,然后 notebook 运行

if "dataset" in path": %run ntbk_path

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

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

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

谁能帮我解决这个错误?

【问题讨论】:

【参考方案1】:

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

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

你如何实现你所需要的?

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

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

name = dbutils.widgets.get("name")
n = int(dbutils.widgets.get("n"))
df = spark.range(0, n)
df.createOrReplaceTempView(name)

来电笔记本(我们称之为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 做类似的事情,但它可能需要一种“魔法”。它的基础是您可以使用$arg_name="value" 将参数传递给被调用的笔记本,甚至可以引用小部件中指定的值。但无论如何,值的检查都会发生在被调用的笔记本中。

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

flag = dbutils.widgets.get("generate_data")
dataframe = None
if flag == "true":
  dataframe = ..... create datarame

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

------ 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

【讨论】:

感谢您的详细解释这有帮助!。有什么方法可以传递变量: var1 =" value1" ; %run 笔记本 $param1=var1 ;我在调用笔记本中将“var1”作为参数值。 您需要将value1 放入小部件中,并将该小部件的名称称为$name - 在示例中

以上是关于从数据块中的另一个笔记本返回数据帧的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据块中的数据从熊猫数据帧加载到火花数据帧

如何从power bi中的python函数返回单个数据帧

我无法从数据块中的 spark 数据帧创建加载数据到 Azure Synapse (DWH)

如何从管道中的 sklearn TFIDF Vectorizer 返回数据帧?

从并行化函数返回数据帧字典?

从数据帧中激发 MLLib Kmeans,然后再返回