从另一个笔记本运行一个Databricks笔记本

本文描述如何使用Databricks笔记本对使用模块化代码、链接或嵌入式笔记本以及if-then-else逻辑的复杂工作流进行编码。

的比较运行%笔记本工作流程

运行%命令允许您在一个笔记本中包含另一个笔记本。你可以使用运行%模块化你的代码,例如把支持函数放在一个单独的笔记本里。您还可以使用它来连接实现分析步骤的笔记本。当你使用运行%时,被调用的notebook立即执行,其中定义的函数和变量在调用notebook中可用。

笔记本的工作流程是一个补充运行%因为它们允许您向笔记本传递参数并从笔记本返回值。这允许您构建具有依赖关系的复杂工作流和管道。例如,您可以获得目录中的文件列表,并将名称传递给另一个笔记本,这是不可能的运行%.您还可以基于返回值创建if-then-else工作流,或者使用相对路径调用其他笔记本。

要实现笔记本工作流,请使用dbutils.notebook。*方法。不像运行%,dbutils.notebook.run ()方法启动一个新作业来运行笔记本。

这些方法,就像所有dbutilsapi,仅在Python和Scala中可用。但是,您可以使用dbutils.notebook.run ()调用R笔记本。

请注意

基于笔记本工作流的作业必须在30天或更短时间内完成。不支持基于模块化或链接笔记本任务的长期运行作业。

API

方法中提供的方法dbutils.notebook构建笔记本工作流程的API是:运行而且退出.参数和返回值都必须是字符串。

运行(路径:字符串,timeout_seconds:int,参数:地图):字符串

运行一个笔记本并返回它的退出值。该方法启动一个立即运行的临时作业。

timeout_seconds参数控制运行的超时(0表示没有超时):调用运行如果未在指定时间内完成,则抛出异常。如果Databricks宕机超过10分钟,则无论如何笔记本运行都将失败timeout_seconds

参数参数设置目标笔记本的小部件值。特别是,如果您正在运行的笔记本有一个名为一个,然后传递一个键值对(“A”:“B”)参数的参数的一部分run ()调用,然后检索widget的值一个将返回“B”.控件中可以找到创建和使用小部件的说明砖小部件篇文章。

请注意

参数参数只接受拉丁字符(ASCII字符集)。使用非ascii字符将返回错误。

运行使用

dbutils笔记本运行“notebook-name”60“参数”“数据”“argument2”“data2”...})
dbutils笔记本运行“notebook-name”60地图“参数”->“数据”“argument2”->“data2”…))

运行例子

假设您有一个名为工作流使用一个名为喷火打印小部件的值:

dbutils小部件文本“foo”“fooDefault”“fooEmptyLabel”打印dbutils小部件得到“foo”

运行dbutils.notebook.run(“工作流”,60岁,{“foo”:“酒吧”})产生以下结果:

带有小部件的笔记本工作流

小部件具有您通过工作流传递的值,“酒吧”,而不是默认。

退出(价值:字符串):无效退出一个有值的笔记本。如果你调用笔记本使用运行方法,这是返回的值。

dbutils笔记本退出“returnValue”

调用dbutils.notebook.exit在一个作业中使笔记本顺利完成。如果希望导致作业失败,请抛出异常。

例子

在下面的示例中,将参数传递给DataImportNotebook并运行不同的笔记本电脑(DataCleaningNotebookErrorHandlingNotebook)的结果DataImportNotebook

笔记本的工作流

当笔记本工作流运行时,您会看到一个到正在运行的笔记本的链接:

笔记本工作流程运行

点击笔记本链接笔记本工作#xxxx查看运行的详细信息:

笔记本工作流运行结果

传递结构化数据

本节说明如何在笔记本之间传递结构化数据。

#示例1 -通过临时视图返回数据。使用dbutils.notebook.exit()只能返回一个字符串,但由于调用的notebook驻留在同一个JVM中,所以可以返回一个名称,引用存储在临时视图中的数据。##在调用的笔记本火花范围5toDF“价值”createOrReplaceGlobalTempView“my_data”dbutils笔记本退出“my_data”##在来电者笔记本上returned_tabledbutils笔记本运行“LOCATION_OF_CALLEE_NOTEBOOK”60global_temp_db火花相依得到“spark.sql.globalTempDatabase”显示表格global_temp_db+“。”+returned_table))#例2 -通过DBFS返回数据。#对于较大的数据集,您可以将结果写入DBFS,然后返回存储数据的DBFS路径。##在调用的笔记本dbutilsfsrm“/ tmp /结果/ my_data”递归真正的火花范围5toDF“价值”格式“铺”负载“dbfs: / tmp /结果/ my_data”dbutils笔记本退出“dbfs: / tmp /结果/ my_data”##在来电者笔记本上returned_tabledbutils笔记本运行“LOCATION_OF_CALLEE_NOTEBOOK”60显示火花格式“铺”负载returned_table))#示例3 -返回JSON数据。要返回多个值,可以使用标准JSON库对结果进行序列化和反序列化。##在调用的笔记本进口jsondbutils笔记本退出json转储({“状态”“OK”“表”“my_data”}))##在来电者笔记本上结果dbutils笔记本运行“LOCATION_OF_CALLEE_NOTEBOOK”60打印json加载结果))
//示例1 -通过临时视图返回数据。//使用dbutils.notebook.exit()只能返回一个字符串,但由于调用的notebook驻留在同一个JVM中,所以可以//返回一个名称,引用存储在临时视图中的数据。/**在被调用的笔记本*/sc并行化15).toDF().createOrReplaceGlobalTempView“my_data”dbutils笔记本退出“my_data”/**在调用者笔记本*/瓦尔returned_tabledbutils笔记本运行“LOCATION_OF_CALLEE_NOTEBOOK”60瓦尔global_temp_db火花相依得到“spark.sql.globalTempDatabase”显示表格global_temp_db+“。”+returned_table))//示例2 -通过DBFS返回数据。//对于较大的数据集,可以将结果写入DBFS,然后返回存储数据的DBFS路径。/**在被调用的笔记本*/dbutilsfsrm“/ tmp /结果/ my_data”递归真正的sc并行化15).toDF().格式“铺”).保存“dbfs: / tmp /结果/ my_data”dbutils笔记本退出“dbfs: / tmp /结果/ my_data”/**在调用者笔记本*/瓦尔returned_tabledbutils笔记本运行“LOCATION_OF_CALLEE_NOTEBOOK”60显示sqlContext格式“铺”).负载returned_table))//示例3 -返回JSON数据。//要返回多个值,可以使用标准JSON库对结果进行序列化和反序列化。/**在被调用的笔记本*///导入jackson json库进口comfasterxml杰克逊模块scalaDefaultScalaModule进口comfasterxml杰克逊模块scala实验ScalaObjectMapper进口comfasterxml杰克逊databindobjectmap//创建一个json序列化器瓦尔jsonMapperobjectmapScalaObjectMapperjsonMapperregisterModuleDefaultScalaModule//使用json退出dbutils笔记本退出jsonMapperwriteValueAsString地图“状态”->“OK”“表”->“my_data”)))/**在调用者笔记本*/瓦尔结果dbutils笔记本运行“LOCATION_OF_CALLEE_NOTEBOOK”60printlnjsonMapperreadValue地图字符串字符串]] (结果))

处理错误

本节说明如何处理笔记本工作流程中的错误。

#工作流中的错误抛出WorkflowException。defrun_with_retry笔记本超时arg游戏{},max_retries3.):num_retries0真正的试一试返回dbutils笔记本运行笔记本超时arg游戏除了异常作为e如果num_retries>max_retries提高e其他的打印“失败的错误”enum_retries+ =1run_with_retry“LOCATION_OF_CALLEE_NOTEBOOK”60max_retries5
//工作流中的错误抛出WorkflowException。进口comWorkflowException//由于dbutils.notebook.run()只是一个函数调用,您可以使用标准的Scala try-catch重试失败//控制流。这里我们展示了一个多次尝试使用笔记本的例子。defrunRetry笔记本字符串超时Intarg游戏地图字符串字符串地图maxTriesInt3.):字符串varnumTries0真正的试一试返回dbutils笔记本运行笔记本超时arg游戏情况下eWorkflowException如果numTries<maxTries= >println"错误,正在重试:"+enumTries+ =1""//未到达runRetry“LOCATION_OF_CALLEE_NOTEBOOK”超时60maxTries5

同时运行多个笔记本电脑

您可以通过使用标准的Scala和Python构造同时运行多个笔记本,例如Threads (ScalaPython)及期货(ScalaPython).高级笔记本工作流笔记本演示了如何使用这些构造。笔记本是用Scala编写的,但你可以很容易地用Python编写相应的代码。运行示例:

  1. 下载笔记本电脑存档

  2. 将存档导入工作空间。

  3. 运行并发的笔记本笔记本。