从Databricks中的另一个笔记本返回数据帧 [英] Return a dataframe from another notebook in databricks

查看:12
本文介绍了从Databricks中的另一个笔记本返回数据帧的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个笔记本,它将处理文件并创建结构化格式的数据框。 现在,我需要导入在另一个笔记本中创建的数据框,但问题是在运行笔记本之前,我只需要对需要运行的某些方案进行验证。

通常,要导入所有数据结构,我们使用%run。但在我的例子中,它应该是IF子句和THEN笔记本运行的组合

if "dataset" in path": %run ntbk_path

它提供了一个错误&路径不存在&

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

这一次我无法获得所有数据结构。

有人能帮我解决此错误吗?

推荐答案

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

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

如何实施您需要的内容?

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

称为Notebook(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

这篇关于从Databricks中的另一个笔记本返回数据帧的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆