Return 来自数据块中另一个笔记本的数据框
Return a dataframe from another notebook in databricks
我有一个笔记本可以处理文件并创建结构化格式的数据框。
现在我需要导入在另一个笔记本中创建的数据框,但问题是在 运行 连接笔记本之前我需要验证仅在某些情况下我需要 运行.
通常导入所有数据结构,我们使用%运行。但就我而言,它应该是 if 子句和 notebook 运行
的组合
if "dataset" in path": %run ntbk_path
它给出错误“路径不存在”
if "dataset" in path": dbutils.notebook.run(ntbk_path)
这个我搞不懂所有的数据结构
有人可以帮我解决这个错误吗?
要正确实施它,您需要了解其运作方式:
%run
是一个单独的指令,应该放在单独的笔记本单元格中,不能将它与 Python 代码混合。另外,它不能接受笔记本名称作为变量。 %run
正在做什么 - 它正在当前 Spark 会话 的上下文中评估来自指定笔记本的代码,因此该笔记本中定义的所有内容 - 变量、函数等。在来电笔记本中可用。
dbutils.notebook.run
是一个函数,它可以采用笔记本路径,加上参数,并且 在当前集群 上将其作为单独的作业执行。因为它是作为一个单独的作业执行的,所以它不会与当前笔记本共享上下文,并且其中定义的所有内容 都不会在调用者笔记本中可用 (您可以 return一个简单的字符串作为执行结果,但它的最大长度相对较小)。 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
我有一个笔记本可以处理文件并创建结构化格式的数据框。 现在我需要导入在另一个笔记本中创建的数据框,但问题是在 运行 连接笔记本之前我需要验证仅在某些情况下我需要 运行.
通常导入所有数据结构,我们使用%运行。但就我而言,它应该是 if 子句和 notebook 运行
的组合if "dataset" in path": %run ntbk_path
它给出错误“路径不存在”
if "dataset" in path": dbutils.notebook.run(ntbk_path)
这个我搞不懂所有的数据结构
有人可以帮我解决这个错误吗?
要正确实施它,您需要了解其运作方式:
%run
是一个单独的指令,应该放在单独的笔记本单元格中,不能将它与 Python 代码混合。另外,它不能接受笔记本名称作为变量。%run
正在做什么 - 它正在当前 Spark 会话 的上下文中评估来自指定笔记本的代码,因此该笔记本中定义的所有内容 - 变量、函数等。在来电笔记本中可用。dbutils.notebook.run
是一个函数,它可以采用笔记本路径,加上参数,并且 在当前集群 上将其作为单独的作业执行。因为它是作为一个单独的作业执行的,所以它不会与当前笔记本共享上下文,并且其中定义的所有内容 都不会在调用者笔记本中可用 (您可以 return一个简单的字符串作为执行结果,但它的最大长度相对较小)。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