運行一個磚筆記本從另一個筆記本

請注意

對於大多數編排用例,磚推薦使用磚的工作模塊化代碼文件。你應該隻使用dbutils.notebook本文中描述的API時不能使用多任務工作實現你的用例。例子是條件執行和循環筆記本在一組動態的參數。

本文描述了如何使用磚筆記本代碼複雜的工作流,使用模塊化的代碼,鏈接或嵌入筆記本和if - then - else邏輯。

的比較運行%dbutils.notebook.run ()

運行%命令允許您將另一個筆記本在一個筆記本。您可以使用運行%模塊化代碼,例如通過將支持功能在一個單獨的筆記本。你也可以用它來連接筆記本電腦,實現在一個分析步驟。當你使用運行%,立即執行被調用的筆記本中定義的函數和變量,可用在調用筆記本。

dbutils.notebookAPI是一個補充運行%因為它可以讓您從一個筆記本傳遞參數和返回值。這允許您構建複雜的工作流和管道與依賴。例如,您可以獲得一個目錄中的文件的列表並將名稱傳遞給另一個筆記本電腦,這是不可能的運行%。您還可以創建if - then - else工作流基於返回值或調用其他筆記本使用相對路徑。

不像運行%,dbutils.notebook.run ()方法開始一份新工作運行的筆記本。

這些方法,就像所有的dbutils隻在Python和Scala api,可用。不過,您可以使用dbutils.notebook.run ()調用一個R筆記本。

使用運行%導入一個筆記本

在這個例子中,第一個筆記本定義一個函數,反向後,可在第二個筆記本使用運行%神奇的執行shared-code-notebook

共享代碼的筆記本
筆記本導入示例

因為這兩個筆記本在同一個目錄在工作區中,使用前綴。/。/ shared-code-notebook表明路徑應相對於解決當前運行的筆記本。比如,你可以筆記本組織成目錄運行%/ dir /筆記本,或者使用絕對路徑運行%/用戶/ username@organization.com/directory/notebook

請注意

  • 運行%必須在一個細胞本身,因為它運行整個筆記本內聯。

  • 不能使用運行%Python文件並運行進口該文件中定義的實體變成一個筆記本。從Python文件導入,明白了模塊化代碼使用文件。或者文件打包成一個Python庫,創建一個磚圖書館從Python庫,庫安裝到集群你用你的筆記本。

  • 當你使用運行%運行一個筆記本,其中包含小部件,默認情況下,筆記本運行指定小部件的默認值。您還可以通過值小部件;看到使用磚小部件的%

dbutils.notebookAPI

中可用的方法dbutils.notebookAPI是運行退出。這兩個參數和返回值必須是字符串。

運行(路徑:字符串,timeout_seconds:int,參數:地圖):字符串

運行一個筆記本和返回退出值。該方法立即開始運行的臨時工作。

timeout_seconds運行參數控製超時(0意味著沒有超時):調用運行拋出一個異常,如果沒有在指定的時間內完成。如果磚了超過10分鍾,筆記本運行失敗,不管timeout_seconds

參數參數設置部件價值目標的筆記本。具體來說,如果您運行的筆記本有一個小部件一個,你通過一個鍵-值對(“A”:“B”)參數的參數run ()電話,然後檢索工具的價值一個將返回“B”。你可以找到小部件的創建和使用的指令磚小部件篇文章。

請注意

  • 參數參數隻接受拉丁字符(ASCII字符集)。使用非ascii字符返回一個錯誤。

  • 就業崗位使用dbutils.notebookAPI在30天內必須完成或更少。

運行使用

dbutils筆記本運行(“notebook-name”,60,{“參數”:“數據”,“argument2”:“data2”,})
dbutils筆記本運行(“notebook-name”,60,地圖(“參數”- >“數據”,“argument2”- >“data2”,…))

運行例子

假設你有一個筆記本工作流用一個小名叫噴火打印部件的價值:

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

運行dbutils.notebook.run(“工作流”,60歲,{“foo”:“酒吧”})產生以下結果:

筆記本和小部件

您通過使用小部件有價值dbutils.notebook.run (),“酒吧”,而不是默認的。

退出(價值:字符串):無效退出一個筆記本和一個值。如果你叫一個筆記本使用運行方法,這是返回的值。

dbutils筆記本退出(“returnValue”)

調用dbutils.notebook.exit使筆記本成功完成的工作。如果你想使工作失敗,拋出異常。

例子

在以下示例中,您傳遞參數DataImportNotebook和運行不同的筆記本電腦(DataCleaningNotebookErrorHandlingNotebook基於結果DataImportNotebook

if - else例子

當代碼運行時,你看到的鏈接筆記本:

鏈接到運行筆記本

查看運行的詳細信息,單擊筆記本鏈接# xxxx筆記本工作

短暫的筆記本電腦運行的結果

通過結構化數據

本節說明如何通過筆記本之間的結構化數據。

#示例1 -通過臨時視圖返回數據。#你隻能返回一個字符串使用dbutils.notebook.exit(),但由於叫筆記本駐留在相同的JVM中,你可以#返回一個引用數據存儲在一個臨時視圖名稱。# #被筆記本火花範圍(5)toDF(“價值”)createOrReplaceGlobalTempView(“my_data”)dbutils筆記本退出(“my_data”)# #在調用者的筆記本returned_table=dbutils筆記本運行(“LOCATION_OF_CALLEE_NOTEBOOK”,60)global_temp_db=火花相依得到(“spark.sql.globalTempDatabase”)顯示((global_temp_db+“。”+returned_table))通過DBFS #示例2 -返回數據。#對於較大的數據集,您可以編寫DBFS和返回結果的DBFS路徑存儲數據。# #被筆記本dbutilsfsrm(“/ tmp /結果/ my_data”,遞歸=真正的)火花範圍(5)toDF(“價值”)格式(“鋪”)負載(“dbfs: / tmp /結果/ my_data”)dbutils筆記本退出(“dbfs: / tmp /結果/ my_data”)# #在調用者的筆記本returned_table=dbutils筆記本運行(“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隻返回一個字符串(),但由於叫筆記本駐留在相同的JVM中,你可以/ /返回一個引用數據存儲在一個臨時視圖名稱。/ * *被筆記本* /sc並行化(15)。toDF()。createOrReplaceGlobalTempView(“my_data”)dbutils筆記本退出(“my_data”)/ * *在調用者的筆記本* /瓦爾returned_table=dbutils筆記本運行(“LOCATION_OF_CALLEE_NOTEBOOK”,60)瓦爾global_temp_db=火花相依得到(“spark.sql.globalTempDatabase”)顯示((global_temp_db+“。”+returned_table))/ /通過DBFS例子2 -返回數據。/ /對於較大的數據集,您可以編寫DBFS和返回結果的DBFS路徑存儲數據。/ * *被筆記本* /dbutilsfsrm(“/ tmp /結果/ my_data”,遞歸=真正的)sc並行化(15)。toDF()。格式(“鋪”)。保存(“dbfs: / tmp /結果/ my_data”)dbutils筆記本退出(“dbfs: / tmp /結果/ my_data”)/ * *在調用者的筆記本* /瓦爾returned_table=dbutils筆記本運行(“LOCATION_OF_CALLEE_NOTEBOOK”,60)顯示(sqlContext格式(“鋪”)。負載(returned_table))/ /例3 -返回JSON數據。/ /返回多個值,您可以使用標準JSON庫進行序列化和反序列化的結果。/ * *被筆記本* // /導入傑克遜json庫進口comfasterxml傑克遜模塊scalaDefaultScalaModule進口comfasterxml傑克遜模塊scala實驗ScalaObjectMapper進口comfasterxml傑克遜databindobjectmap/ /創建一個json序列化器瓦爾jsonMapper=objectmapScalaObjectMapperjsonMapperregisterModule(DefaultScalaModule)/ /退出與jsondbutils筆記本退出(jsonMapperwriteValueAsString(地圖(“狀態”- >“OK”,“表”- >“my_data”)))/ * *在調用者的筆記本* /瓦爾結果=dbutils筆記本運行(“LOCATION_OF_CALLEE_NOTEBOOK”,60)println(jsonMapperreadValue(地圖(字符串,字符串]](結果))

處理錯誤

本節說明如何處理錯誤。

拋出一個WorkflowException #錯誤。defrun_with_retry(筆記本,超時,arg遊戲={},max_retries=3):num_retries=0真正的:試一試:返回dbutils筆記本運行(筆記本,超時,arg遊戲)除了異常作為e:如果num_retries>max_retries:提高e其他的:打印(“失敗的錯誤”,e)num_retries+ =1run_with_retry(“LOCATION_OF_CALLEE_NOTEBOOK”,60,max_retries=5)
/ /錯誤WorkflowException。進口comWorkflowException/ /自dbutils.notebook.run()隻是一個函數調用,您可以使用標準Scala try - catch重試失敗/ /控製流。這裏我們展示一個例子再審筆記本的次數。defrunRetry(筆記本:字符串,超時:Int,arg遊戲:地圖(字符串,字符串]=地圖,maxTries:Int=3):字符串={varnumTries=0(真正的){試一試{返回dbutils筆記本運行(筆記本,超時,arg遊戲)}{情況下e:WorkflowException如果numTries<maxTries= >println(”錯誤,重試:“+e)}numTries+ =1}”“/ /沒有達到}runRetry(“LOCATION_OF_CALLEE_NOTEBOOK”,超時=60,maxTries=5)

同時運行多個筆記本

你可以同時運行多個筆記本使用標準Scala和Python等構造線程(Scala,Python)和未來(Scala,Python)。筆記本的示例演示如何使用這些結構。

  1. 下載以下4個筆記本。筆記本是用Scala編寫的。

  2. 導入筆記本在工作區中到一個文件夾。

  3. 運行同時運行筆記本。

並發運行的筆記本

在新標簽頁打開筆記本

並行運行的筆記本

在新標簽頁打開筆記本

測試筆記本

在新標簽頁打開筆記本

Testing-2筆記本

在新標簽頁打開筆記本