إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
هام
لتنسيق دفتر الملاحظات، استخدم وظائف Databricks. بالنسبة لسيناريوهات وحدات التعليمات البرمجية، استخدم ملفات مساحة العمل. يجب عليك استخدام التقنيات الموضحة في هذه المقالة فقط عندما لا يمكن تنفيذ حالة الاستخدام الخاصة بك باستخدام مهمة Databricks، مثل تكرار دفاتر الملاحظات عبر مجموعة ديناميكية من المعلمات، أو إذا لم يكن لديك حق الوصول إلى ملفات مساحة العمل. لمزيد من المعلومات، راجع جدولة مهام سير العمل وتنسيقها ومشاركة التعليمات البرمجية.
مقارنة بين %run و dbutils.notebook.run()
%run يسمح لك الأمر بتضمين دفتر ملاحظات آخر داخل دفتر ملاحظات. يمكنك استخدام %run لنمذجة التعليمات البرمجية الخاصة بك، على سبيل المثال عن طريق وضع وظائف الدعم في دفتر ملاحظات منفصل. يمكنك أيضا استخدامه لسلسلة دفاتر الملاحظات التي تنفذ الخطوات في التحليل. عند استخدام %run، يتم تنفيذ دفتر الملاحظات المسمى على الفور وتصبح الوظائف والمتغيرات المحددة فيه متوفرة في دفتر الملاحظات الاستدعاء.
dbutils.notebook تعد واجهة برمجة التطبيقات مكملا لها %run لأنها تتيح لك تمرير المعلمات وإرجاع القيم من دفتر ملاحظات. يسمح لك هذا بإنشاء مهام سير عمل ومسارات معقدة مع تبعيات. على سبيل المثال، يمكنك الحصول على قائمة بالملفات في دليل وتمرير الأسماء إلى دفتر ملاحظات آخر، وهو أمر غير ممكن مع %run. يمكنك أيضا إنشاء مهام سير عمل if-then-else استنادا إلى قيم الإرجاع أو استدعاء دفاتر الملاحظات الأخرى باستخدام مسارات نسبية.
على عكس %run، dbutils.notebook.run() يبدأ الأسلوب مهمة جديدة لتشغيل دفتر الملاحظات.
تتوفر هذه الأساليب، مثل جميع dbutils واجهات برمجة التطبيقات، فقط في Python وSc scala. ومع ذلك، يمكنك استخدام dbutils.notebook.run() لاستدعاء دفتر ملاحظات R.
استخدام %run لاستيراد دفتر ملاحظات
في هذا المثال، يعرف دفتر الملاحظات الأول دالة، ، reverseوالتي تتوفر في دفتر الملاحظات الثاني بعد استخدام %run السحر لتنفيذ shared-code-notebook.


نظرا لوجود كل من دفتري الملاحظات في نفس الدليل في مساحة العمل، استخدم البادئة ./ في ./shared-code-notebook للإشارة إلى أنه يجب حل المسار بالنسبة إلى دفتر الملاحظات قيد التشغيل حاليا. يمكنك تنظيم دفاتر الملاحظات في دلائل، مثل %run ./dir/notebook، أو استخدام مسار مطلق مثل %run /Users/username@organization.com/directory/notebook.
إشعار
%runيجب أن يكون في خلية بمفرده، لأنه يقوم بتشغيل دفتر الملاحظات بأكمله مضمنا.- لا يمكنك استخدام
%runلتشغيل ملف Python والكياناتimportالمعرفة في هذا الملف في دفتر ملاحظات. للاستيراد من ملف Python، راجع تعديل التعليمات البرمجية باستخدام الملفات. أو قم بحزم الملف في مكتبة Python، وأنشئ مكتبة Azure Databricks من مكتبة Python هذه، وقم بتثبيت المكتبة في المجموعة التي تستخدمها لتشغيل دفتر الملاحظات. - عند استخدام
%runلتشغيل دفتر ملاحظات يحتوي على عناصر واجهة مستخدم، يتم تشغيل دفتر الملاحظات المحدد افتراضيا مع القيم الافتراضية لعنواة واجهة المستخدم. يمكنك أيضا تمرير القيم إلى عناصر واجهة المستخدم؛ راجع استخدام عناصر واجهة مستخدم Databricks مع ٪run.
dbutils.notebook API
الأساليب المتوفرة dbutils.notebook في واجهة برمجة التطبيقات هي run و exit. يجب أن تكون كل من المعلمات والقيم المرجعة سلاسل.
run(path: String, timeout_seconds: int, arguments: Map): String
قم بتشغيل دفتر ملاحظات وإرجاع قيمة الخروج الخاصة به. يبدأ الأسلوب مهمة سريعة الزوال تعمل على الفور.
timeout_seconds تتحكم المعلمة في مهلة التشغيل (0 تعني عدم وجود مهلة): الاستدعاء لطرح run استثناء إذا لم ينته خلال الوقت المحدد. إذا كان Azure Databricks معطلة لأكثر من 10 دقائق، يفشل تشغيل دفتر الملاحظات بغض النظر عن timeout_seconds.
تعين المعلمة arguments قيم عنصر واجهة المستخدم لدفتر الملاحظات الهدف. على وجه التحديد، إذا كان دفتر الملاحظات الذي تقوم بتشغيله يحتوي على عنصر واجهة مستخدم يسمى A، وقمت بتمرير زوج ("A": "B") قيم المفاتيح كجزء من معلمة الوسيطات إلى run() الاستدعاء، فسيرجع "B"استرداد قيمة عنصر واجهة المستخدم A . يمكنك العثور على إرشادات إنشاء عناصر واجهة المستخدم والعمل معها في مقالة أدوات Databricks.
إشعار
argumentsتقبل المعلمة الأحرف اللاتينية فقط (مجموعة أحرف ASCII). يؤدي استخدام أحرف غير ASCII إلى إرجاع خطأ.- يجب أن تكتمل المهام التي تم إنشاؤها
dbutils.notebookباستخدام واجهة برمجة التطبيقات في 30 يوما أو أقل.
run الاستخدام
Python
dbutils.notebook.run("notebook-name", 60, {"argument": "data", "argument2": "data2", ...})
Scala
dbutils.notebook.run("notebook-name", 60, Map("argument" -> "data", "argument2" -> "data2", ...))
run مثال
لنفترض أن لديك دفتر ملاحظات باسم workflows عنصر واجهة مستخدم يسمى foo يطبع قيمة عنصر واجهة المستخدم:
dbutils.widgets.text("foo", "fooDefault", "fooEmptyLabel")
print(dbutils.widgets.get("foo"))
ينتج عن التشغيل dbutils.notebook.run("workflows", 60, {"foo": "bar"}) النتيجة التالية:

يحتوي عنصر واجهة المستخدم على القيمة التي مررتها باستخدام dbutils.notebook.run()، "bar"، بدلا من القيمة الافتراضية.
exit(value: String): void قم بإنهاء دفتر ملاحظات بقيمة. إذا قمت باستدعاء دفتر ملاحظات باستخدام run الأسلوب ، فهذه هي القيمة التي تم إرجاعها.
dbutils.notebook.exit("returnValue")
يؤدي استدعاء dbutils.notebook.exit وظيفة إلى اكتمال دفتر الملاحظات بنجاح. إذا كنت تريد أن تتسبب في فشل المهمة، فقم بطرح استثناء.
مثل
في المثال التالي، يمكنك تمرير الوسيطات إلى DataImportNotebook دفاتر ملاحظات مختلفة وتشغيلها (DataCleaningNotebook أو ErrorHandlingNotebook) استنادا إلى النتيجة من DataImportNotebook.

عند تشغيل التعليمات البرمجية، يظهر جدول يحتوي على ارتباط إلى دفتر الملاحظات قيد التشغيل:

لعرض تفاصيل التشغيل، انقر فوق الارتباط وقت البدء في الجدول. إذا اكتمل التشغيل، يمكنك أيضا عرض تفاصيل التشغيل بالنقر فوق الارتباط وقت الانتهاء.

تمرير البيانات المنظمة
يوضح هذا القسم كيفية تمرير البيانات المنظمة بين دفاتر الملاحظات.
Python
# Example 1 - returning data through temporary views.
# You can only return one string using dbutils.notebook.exit(), but since called notebooks reside in the same JVM, you can
# return a name referencing data stored in a temporary view.
## In callee notebook
spark.range(5).toDF("value").createOrReplaceGlobalTempView("my_data")
dbutils.notebook.exit("my_data")
## In caller notebook
returned_table = dbutils.notebook.run("LOCATION_OF_CALLEE_NOTEBOOK", 60)
global_temp_db = spark.conf.get("spark.sql.globalTempDatabase")
display(table(global_temp_db + "." + returned_table))
# Example 2 - returning data through DBFS.
# For larger datasets, you can write the results to DBFS and then return the DBFS path of the stored data.
## In callee notebook
dbutils.fs.rm("/tmp/results/my_data", recurse=True)
spark.range(5).toDF("value").write.format("parquet").save("dbfs:/tmp/results/my_data")
dbutils.notebook.exit("dbfs:/tmp/results/my_data")
## In caller notebook
returned_table = dbutils.notebook.run("LOCATION_OF_CALLEE_NOTEBOOK", 60)
display(spark.read.format("parquet").load(returned_table))
# Example 3 - returning JSON data.
# To return multiple values, you can use standard JSON libraries to serialize and deserialize results.
## In callee notebook
import json
dbutils.notebook.exit(json.dumps({
"status": "OK",
"table": "my_data"
}))
## In caller notebook
import json
result = dbutils.notebook.run("LOCATION_OF_CALLEE_NOTEBOOK", 60)
print(json.loads(result))
Scala
// Example 1 - returning data through temporary views.
// You can only return one string using dbutils.notebook.exit(), but since called notebooks reside in the same JVM, you can
// return a name referencing data stored in a temporary view.
/** In callee notebook */
sc.parallelize(1 to 5).toDF().createOrReplaceGlobalTempView("my_data")
dbutils.notebook.exit("my_data")
/** In caller notebook */
val returned_table = dbutils.notebook.run("LOCATION_OF_CALLEE_NOTEBOOK", 60)
val global_temp_db = spark.conf.get("spark.sql.globalTempDatabase")
display(table(global_temp_db + "." + returned_table))
// Example 2 - returning data through DBFS.
// For larger datasets, you can write the results to DBFS and then return the DBFS path of the stored data.
/** In callee notebook */
dbutils.fs.rm("/tmp/results/my_data", recurse=true)
sc.parallelize(1 to 5).toDF().write.format("parquet").save("dbfs:/tmp/results/my_data")
dbutils.notebook.exit("dbfs:/tmp/results/my_data")
/** In caller notebook */
val returned_table = dbutils.notebook.run("LOCATION_OF_CALLEE_NOTEBOOK", 60)
display(sqlContext.read.format("parquet").load(returned_table))
// Example 3 - returning JSON data.
// To return multiple values, you can use standard JSON libraries to serialize and deserialize results.
/** In callee notebook */
// Import jackson json libraries
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import com.fasterxml.jackson.databind.ObjectMapper
// Create a json serializer
val jsonMapper = new ObjectMapper with ScalaObjectMapper
jsonMapper.registerModule(DefaultScalaModule)
// Exit with json
dbutils.notebook.exit(jsonMapper.writeValueAsString(Map("status" -> "OK", "table" -> "my_data")))
/** In caller notebook */
// Import jackson json libraries
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
import com.fasterxml.jackson.databind.ObjectMapper
// Create a json serializer
val jsonMapper = new ObjectMapper with ScalaObjectMapper
jsonMapper.registerModule(DefaultScalaModule)
val result = dbutils.notebook.run("LOCATION_OF_CALLEE_NOTEBOOK", 60)
println(jsonMapper.readValue[Map[String, String]](result))
معالجة الأخطاء
يوضح هذا القسم كيفية معالجة الأخطاء.
Python
# Errors throw 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)
Scala
// Errors throw a WorkflowException.
import com.databricks.WorkflowException
// Since dbutils.notebook.run() is just a function call, you can retry failures using standard Scala try-catch
// control flow. Here we show an example of retrying a notebook a number of times.
def runRetry(notebook: String, timeout: Int, args: Map[String, String] = Map.empty, maxTries: Int = 3): String = {
var numTries = 0
while (true) {
try {
return dbutils.notebook.run(notebook, timeout, args)
} catch {
case e: WorkflowException if numTries < maxTries =>
println("Error, retrying: " + e)
}
numTries += 1
}
"" // not reached
}
runRetry("LOCATION_OF_CALLEE_NOTEBOOK", timeout = 60, maxTries = 5)
تشغيل دفاتر ملاحظات متعددة بشكل متزامن
يمكنك تشغيل دفاتر ملاحظات متعددة في نفس الوقت باستخدام بنيات Scala وPython القياسية مثل مؤشرات الترابط (Scala، Python) و Futures (Scala، Python). توضح دفاتر الملاحظات المثال كيفية استخدام هذه البنيات.
- قم بتنزيل دفاتر الملاحظات الأربع التالية. تتم كتابة دفاتر الملاحظات بلغة Scala.
- استيراد دفاتر الملاحظات إلى مجلد واحد في مساحة العمل.
- تشغيل دفتر الملاحظات تشغيل بشكل متزامن.