Databricks 內建了指令行,比如 %run,允許使用者在一個Notebook中去執行指定的notebook,當運作 %run時,被調用的notebook會立即執行。
%run <notebook_path_name>
%run指令相當于Python語言中的import語句,在被調用notebook中定義的所有變量在目前的notebook中都可用。
注意:%run指令必須獨占一行。不能使用%run去執行Python檔案,并把Python檔案中定義的實體導入到目前notebook中。
舉個例子,有一個Python檔案,NotebookA.py,包含以下代碼:
x = 5
在NotebookB.py檔案中,通過%run來執行NotebookA,就把變量x導入到目前的notebook中了。雖然NotebookB中并沒有定義x,但是可以在NotebookB中通路x變量:
%run /path/notebookA
print(x) # => 5
Notebook 工作流(Notebook Workflow)是 %run 的補充,因為Notebook Workflow能夠把參數傳遞給被調用的Notebook,并從該Notebook中傳回值。通過Notebook Workflow可以建構具有依賴項的複雜工作流和管道。 例如,可以擷取目錄中的檔案清單并将名稱傳遞給另一個Notebook ,而 %run 則無法做到這一點。 還可以根據Notebook 的傳回值建立 if-then-else 工作流或使用相對路徑調用其他Notebook 。
Notebook Workflow主要有兩個函數:
dbutils.notebook.run(path: String, timeout_seconds: int, arguments: Map): String
dbutils.notebook.exit("returnValue")
1.執行Notebook
dbutils.notebook.run() 方法的參數和傳回值都是字元類型,該函數被執行後,會建立一個job,立即執行path參數指定的Notebook。
- path參數指定notebook的路徑,
- timeout參數控制執行的逾時,0表示沒有時間限制。
- arguments 參數用于設定widget的值,該widget的值将會覆寫預設值。
舉個例子,Notebook_C 有如下的widget:
dbutils.widgets.text("datekey","20200701")
startdatekey= int(dbutils.widgets.get("datekey"))
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CN0kjN2YzN2ITMtMzN1IjMwEjNxcTMxETMyAjMtQDOwgjM28CXxETMyAjMvwFN4ADOyYzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
當通過 dbutils.notebook.run() 調用Notebook_C時,可以向該widget來傳參:
dbutils.notebook.run("Notebook_C", 0, {"datekey": "20210701"})
2,傳遞傳回值
在被調用的Notebook中,使用exit()函數向調用者傳回資訊,傳回的是字元串類型:
dbutils.notebook.exit("return_my_data")
在調用者中,run()函數會得到傳回的字元串: "return_my_data"。
3,Notebook 工作流控制
可以通過Python代碼實作Notebook調用的工作流程的控制
# Errors in workflows thrown a WorkflowException.
def run_with_retry(notebook, timeout, args = {}, max_retries = 3):
num_retries = 0
while True:
try:
return dbutils.notebook.run(notebook, timeout, args)
except Exception as e:
if num_retries > max_retries:
raise e
else:
print("Retrying error", e)
num_retries += 1
run_with_retry("LOCATION_OF_CALLEE_NOTEBOOK", 60, max_retries = 5)
參考文檔:
Notebook workflows
作者:悅光陰
出處:http://www.cnblogs.com/ljhdo/
本文版權歸作者和部落格園所有,歡迎轉載,但未經作者同意,必須保留此段聲明,且在文章頁面醒目位置顯示原文連接配接,否則保留追究法律責任的權利。