Başka bir not defterinden Databricks not defteri çalıştırma
Önemli
Not defteri düzenlemesi için Databricks İşleri'ni kullanın. Kod modülerleştirme senaryoları için çalışma alanı dosyalarını kullanın. Bu makalede açıklanan teknikleri yalnızca, dinamik bir parametre kümesi üzerinde not defterlerini döngüye alma gibi bir Databricks işi kullanılarak kullanım örneğiniz uygulanamadığında veya çalışma alanı dosyalarına erişiminiz yoksa kullanmalısınız. Daha fazla bilgi için bkz . İş akışlarını zamanlama ve düzenleme ve kodu paylaşma.
ve karşılaştırması %run
dbutils.notebook.run()
komutu, %run
not defterine başka bir not defteri eklemenize olanak tanır. Örneğin destekleyici işlevleri ayrı bir not defterine yerleştirerek kodunuzu modüler hale getirmek için kullanabilirsiniz %run
. Ayrıca, bir çözümlemedeki adımları uygulayan not defterlerini birleştirmek için de kullanabilirsiniz. kullandığınızda %run
, çağrılan not defteri hemen yürütülür ve içinde tanımlanan işlevler ve değişkenler çağrılan not defterinde kullanılabilir hale gelir.
dbutils.notebook
API, parametreleri not defterine %run
geçirmenize ve not defterinden değer döndürmenize olanak sağladığından bunu tamamlayıcı niteliktedir. Bu, bağımlılıklarla karmaşık iş akışları ve işlem hatları oluşturmanıza olanak tanır. Örneğin, bir dizindeki dosyaların listesini alabilir ve adları ile mümkün %run
olmayan başka bir not defterine geçirebilirsiniz. Ayrıca, dönüş değerlerine göre if-then-else iş akışları oluşturabilir veya göreli yolları kullanarak diğer not defterlerini çağırabilirsiniz.
yönteminin dbutils.notebook.run()
aksine%run
, not defterini çalıştırmak için yeni bir iş başlatır.
Tüm dbutils
API'ler gibi bu yöntemler yalnızca Python ve Scala'da kullanılabilir. Ancak, R not defterini çağırmak için kullanabilirsiniz dbutils.notebook.run()
.
Not defterini içeri aktarmak için kullanma %run
Bu örnekte, ilk not defteri, komutunu yürütmek shared-code-notebook
için sihri kullandıktan %run
sonra ikinci not defterinde bulunan bir işlevi reverse
tanımlar.
Bu not defterlerinin her ikisi de çalışma alanında aynı dizinde olduğundan, yolun şu anda çalışan not defterine göre çözümlenmesi gerektiğini belirtmek için ön ekini ./
./shared-code-notebook
kullanın. Not defterlerini gibi %run ./dir/notebook
dizinler halinde düzenleyebilir veya gibi %run /Users/username@organization.com/directory/notebook
mutlak bir yol kullanabilirsiniz.
Not
%run
tüm not defterini satır içinde çalıştırdığından hücrede tek başına olmalıdır.- Bir Python dosyasını ve bu dosyada tanımlanan varlıkları bir not defterinde çalıştırmak için kullanamazsınız
%run
.import
Python dosyasından içeri aktarmak için bkz . Dosyaları kullanarak kodunuzu modüler hale getirmek. Alternatif olarak, dosyayı bir Python kitaplığına paketleyin, bu Python kitaplığından bir Azure Databricks kitaplığı oluşturun ve kitaplığı not defterinizi çalıştırmak için kullandığınız kümeye yükleyin. - Pencere öğeleri içeren bir not defterini çalıştırmak için kullandığınızda
%run
, varsayılan olarak belirtilen not defteri pencere öğesinin varsayılan değerleriyle çalışır. Değerleri pencere öğelerine de geçirebilirsiniz; Bkz . %run ile Databricks pencere öğelerini kullanma.
dbutils.notebook
UPA
API'de dbutils.notebook
kullanılabilen yöntemler ve exit
şeklindedirrun
. Hem parametreler hem de dönüş değerleri dize olmalıdır.
run(path: String, timeout_seconds: int, arguments: Map): String
Not defterini çalıştırın ve çıkış değerini döndürür. yöntemi hemen çalışan kısa ömürlü bir iş başlatır.
timeout_seconds
parametresi çalıştırmanın zaman aşımını denetler (0, zaman aşımı olmadığı anlamına gelir): belirtilen süre içinde tamamlanmazsa bir özel durum oluşturma çağrısırun
. Azure Databricks 10 dakikadan uzun süre çalışmıyorsa, not defteri çalıştırması timeout_seconds
ne olursa olsun başarısız olur.
parametresi hedef arguments
not defterinin pencere öğesi değerlerini ayarlar. Özellikle, çalıştırdığınız not defterinde adlı A
bir pencere öğesi varsa ve çağrısına bağımsız değişken parametresinin run()
bir parçası olarak bir anahtar-değer çifti ("A": "B")
geçirirseniz, pencere öğesinin A
değerini almak döndürür"B"
. Pencere öğeleri oluşturma ve pencere öğeleriyle çalışma yönergelerini Databricks pencere öğeleri makalesinde bulabilirsiniz.
Not
arguments
parametresi yalnızca Latin karakterleri (ASCII karakter kümesi) kabul eder. ASCII olmayan karakterler kullanıldığında hata döndürülüyor.- API kullanılarak
dbutils.notebook
oluşturulan işlerin 30 gün veya daha kısa sürede tamamlanması gerekir.
run
Kullanım
Python
dbutils.notebook.run("notebook-name", 60, {"argument": "data", "argument2": "data2", ...})
Scala
dbutils.notebook.run("notebook-name", 60, Map("argument" -> "data", "argument2" -> "data2", ...))
run
Örnek
Pencere öğesinin workflows
değerini yazdıran adlı bir pencere öğesi içeren bir foo
not defteriniz olduğunu varsayalım:
dbutils.widgets.text("foo", "fooDefault", "fooEmptyLabel")
print(dbutils.widgets.get("foo"))
Çalıştırma dbutils.notebook.run("workflows", 60, {"foo": "bar"})
aşağıdaki sonucu verir:
Pencere öğesi, varsayılan değer yerine , "bar"
kullanarak dbutils.notebook.run()
geçirdiğiniz değere sahipti.
exit(value: String): void
Değer içeren bir not defterinden çıkın. yöntemini kullanarak run
bir not defterini çağırırsanız, döndürülen değer budur.
dbutils.notebook.exit("returnValue")
bir işte çağırmak dbutils.notebook.exit
not defterinin başarıyla tamamlanmasına neden olur. İşin başarısız olmasına neden olmak istiyorsanız bir özel durum oluşturabilirsiniz.
Örnek
Aşağıdaki örnekte, bağımsız değişkenleri öğesine DataImportNotebook
geçirir ve sonucuna DataImportNotebook
bağlı olarak farklı not defterlerini (DataCleaningNotebook
veya ErrorHandlingNotebook
) çalıştırırsınız.
Kod çalıştırıldığında, çalışan not defterinin bağlantısını içeren bir tablo görüntülenir:
Çalıştırma ayrıntılarını görüntülemek için, tablodaki Başlangıç zamanı bağlantısına tıklayın. Çalıştırma tamamlandıysa, Bitiş zamanı bağlantısına tıklayarak çalıştırma ayrıntılarını da görüntüleyebilirsiniz.
Yapılandırılmış verileri geçirme
Bu bölümde, yapılandırılmış verilerin not defterleri arasında nasıl geçirıldığı gösterilmektedir.
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))
Hataları işleme
Bu bölümde hataların nasıl işleneceğini gösterilmektedir.
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)
Birden çok not defterini eşzamanlı olarak çalıştırma
İş Parçacıkları (Scala, Python) ve Vadeli İşlemler (Scala, Python) gibi standart Scala ve Python yapılarını kullanarak aynı anda birden çok not defteri çalıştırabilirsiniz. Örnek not defterleri bu yapıların nasıl kullanılacağını gösterir.
- Aşağıdaki 4 not defterini indirin. Not defterleri Scala'da yazılır.
- Not defterlerini çalışma alanında tek bir klasöre aktarın.
- Eşzamanlı çalıştır not defterini çalıştırın.