運行一個磚筆記本從另一個筆記本
請注意
對於大多數編排用例,磚推薦使用磚的工作或模塊化代碼文件。你應該隻使用dbutils.notebook
本文中描述的API時不能使用多任務工作實現你的用例。例子是條件執行和循環筆記本在一組動態的參數。
本文描述了如何使用磚筆記本代碼複雜的工作流,使用模塊化的代碼,鏈接或嵌入筆記本和if - then - else邏輯。
的比較運行%
和dbutils.notebook.run ()
的運行%命令允許您將另一個筆記本在一個筆記本。您可以使用運行%
模塊化代碼,例如通過將支持功能在一個單獨的筆記本。你也可以用它來連接筆記本電腦,實現在一個分析步驟。當你使用運行%
,立即執行被調用的筆記本中定義的函數和變量,可用在調用筆記本。
的dbutils.notebook
API是一個補充運行%
因為它可以讓您從一個筆記本傳遞參數和返回值。這允許您構建複雜的工作流和管道與依賴。例如,您可以獲得一個目錄中的文件的列表並將名稱傳遞給另一個筆記本電腦,這是不可能的運行%
。您還可以創建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
。
dbutils.notebook
API
中可用的方法dbutils.notebook
API是運行
和退出
。這兩個參數和返回值必須是字符串。
運行(路徑:字符串,timeout_seconds:int,參數:地圖):字符串
運行一個筆記本和返回退出值。該方法立即開始運行的臨時工作。
的timeout_seconds
運行參數控製超時(0意味著沒有超時):調用運行
拋出一個異常,如果沒有在指定的時間內完成。如果磚了超過10分鍾,筆記本運行失敗,不管timeout_seconds
。
的參數
參數設置部件價值目標的筆記本。具體來說,如果您運行的筆記本有一個小部件一個
,你通過一個鍵-值對(“A”:“B”)
參數的參數run ()
電話,然後檢索工具的價值一個
將返回“B”
。你可以找到小部件的創建和使用的指令磚小部件篇文章。
請注意
的
參數
參數隻接受拉丁字符(ASCII字符集)。使用非ascii字符返回一個錯誤。就業崗位使用
dbutils.notebook
API在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
和運行不同的筆記本電腦(DataCleaningNotebook
或ErrorHandlingNotebook
基於結果DataImportNotebook
。
當代碼運行時,你看到的鏈接筆記本:
查看運行的詳細信息,單擊筆記本鏈接# 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路徑存儲數據。# #被筆記本dbutils。fs。rm(“/ 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。並行化(1來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路徑存儲數據。/ * *被筆記本* /dbutils。fs。rm(“/ tmp /結果/ my_data”,遞歸=真正的)sc。並行化(1來5)。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庫進口com。fasterxml。傑克遜。模塊。scala。DefaultScalaModule進口com。fasterxml。傑克遜。模塊。scala。實驗。ScalaObjectMapper進口com。fasterxml。傑克遜。databind。objectmap/ /創建一個json序列化器瓦爾jsonMapper=新objectmap與ScalaObjectMapperjsonMapper。registerModule(DefaultScalaModule)/ /退出與jsondbutils。筆記本。退出(jsonMapper。writeValueAsString(地圖(“狀態”- >“OK”,“表”- >“my_data”)))/ * *在調用者的筆記本* /瓦爾結果=dbutils。筆記本。運行(“LOCATION_OF_CALLEE_NOTEBOOK”,60)println(jsonMapper。readValue(地圖(字符串,字符串]](結果))
處理錯誤
本節說明如何處理錯誤。
拋出一個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。進口com。磚。WorkflowException/ /自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)