Widgety Databricks
Vstupní widgety umožňují přidávat do poznámkových bloků a řídicích panelů parametry. Widget můžete přidat z uživatelského rozhraní Databricks nebo pomocí rozhraní API widgetu. Pokud chcete přidat nebo upravit widget, musíte mít oprávnění CAN EDIT v poznámkovém bloku.
Pokud používáte Databricks Runtime 11.3 LTS nebo novější, můžete v poznámkových blocích Databricks použít také nástroje ipywidget.
Widgety Databricks jsou nejvhodnější pro:
- Vytvoření poznámkového bloku nebo řídicího panelu, který se znovu spustí s různými parametry
- Rychlé zkoumání výsledků jednoho dotazu s různými parametry
Pokud chcete zobrazit dokumentaci k rozhraní API widgetu v jazyce Scala, Python nebo R, použijte následující příkaz: dbutils.widgets.help()
Typy widgetů Databricks
Existují 4 typy widgetů:
text
: Zadejte hodnotu do textového pole.dropdown
: Vyberte hodnotu ze seznamu zadaných hodnot.combobox
: Kombinace textu a rozevíracího seznamu Vyberte hodnotu ze zadaného seznamu nebo zadejte hodnotu do textového pole.multiselect
: Vyberte jednu nebo více hodnot ze seznamu zadaných hodnot.
Rozevírací seznamy widgetu a textová pole se zobrazí hned za panelem nástrojů poznámkového bloku. Widgety přijímají pouze řetězcové hodnoty.
Vytvoření widgetu pomocí uživatelského rozhraní
Pokud chcete vytvořit widget, vyberte Upravit > widget Přidat. V dialogovém okně Přidat widget zadejte název widgetu , volitelný popisek, typ, typ parametru, možné hodnoty a volitelnou výchozí hodnotu. V dialogovém okně je název parametru, který používáte pro odkaz na widget v kódu. Popisek widgetu je volitelný název, který se zobrazí nad widgetem v uživatelském rozhraní.
Po vytvoření widgetu můžete najet myší na název widgetu a zobrazit popis, který popisuje, jak na widget odkazovat.
Pomocí nabídky kebab můžete widget upravit nebo odebrat:
Použití widgetů Databricks na výpočetním clusteru
Tato část popisuje, jak používat widgety Databricks v poznámkovém bloku připojeném k výpočetnímu clusteru. Pokud chcete použít widgety v poznámkovém bloku připojeném k SQL Warehouse, přečtěte si téma Použití widgetů Databricks ve službě SQL Warehouse.
Rozhraní API widgetu Databricks (cluster)
Rozhraní API widgetu je navržené tak, aby bylo konzistentní v jazyce Scala, Python a R. Rozhraní API widgetu v SQL se mírně liší, ale odpovídá ostatním jazykům. Widgety spravujete prostřednictvím referenčního rozhraní nástrojů Databricks (dbutils).
- Prvním argumentem pro všechny typy widgetů je
name
. Toto je název, který používáte pro přístup k widgetu. - Druhým argumentem je
defaultValue
výchozí nastavení widgetu. - Třetí argument je pro všechny typy widgetů kromě
text
choices
, seznam hodnot, které widget může převzít. Tento argument se nepoužívá protext
widgety typu. - Posledním argumentem je
label
volitelná hodnota popisku zobrazeného v textovém poli nebo rozevíracím seznamu widgetu.
Příklad widgetu Databricks (cluster)
Pokud chcete zobrazit podrobnou dokumentaci k rozhraní API pro každou metodu, použijte dbutils.widgets.help("<method-name>")
. Rozhraní API nápovědy je ve všech jazycích stejné. Příklad:
dbutils.widgets.help("dropdown")
Vytvořte jednoduchý rozevírací widget.
Python
dbutils.widgets.dropdown("state", "CA", ["CA", "IL", "MI", "NY", "OR", "VA"])
SQL
CREATE WIDGET DROPDOWN state DEFAULT "CA" CHOICES SELECT * FROM (VALUES ("CA"), ("IL"), ("MI"), ("NY"), ("OR"), ("VA"))
Interakce s widgetem z panelu widgetu
K aktuální hodnotě widgetu se dostanete voláním:
Python
dbutils.widgets.get("state")
SQL
SELECT "${state}"
Nakonec můžete widget nebo všechny widgety v poznámkovém bloku odebrat:
Python
dbutils.widgets.remove("state")
dbutils.widgets.removeAll()
SQL
REMOVE WIDGET state
Pokud widget odeberete, nemůžete ve stejné buňce vytvořit widget. Widget musíte vytvořit v jiné buňce.
Použití hodnot widgetů ve Spark SQL (clusteru)
Spark SQL přistupuje k hodnotám widgetu jako řetězcové literály, které lze použít v dotazech.
Při interaktivním spouštění poznámkových bloků můžete přistupovat k widgetům definovaným v libovolném jazyce ze Spark SQL. Zvažte následující pracovní postup:
Vytvořte rozevírací widget pro všechny databáze v aktuálním katalogu:
dbutils.widgets.dropdown("database", "default", [database[0] for database in spark.catalog.listDatabases()])
Vytvořte textový widget pro ruční zadání názvu tabulky:
dbutils.widgets.text("table", "")
Spuštěním dotazu SQL zobrazíte všechny tabulky v databázi (vybrané z rozevíracího seznamu):
SHOW TABLES IN ${database}
Do widgetu
table
ručně zadejte název tabulky.Zobrazte náhled obsahu tabulky, aniž byste museli upravovat obsah dotazu:
SELECT * FROM ${database}.${table} LIMIT 100
Poznámka:
Obecně platí, že widgety nelze použít k předávání argumentů mezi různými jazyky v poznámkovém bloku. Widget arg1
můžete vytvořit v buňce Pythonu a použít ho v buňce SQL nebo Scala, pokud poběžíte po jedné buňce. To ale nefunguje, pokud jako úlohu použijete Spustit vše nebo spustíte poznámkový blok.
Alternativní řešení:
- Pro poznámkové bloky, které nekombinují jazyky, můžete vytvořit poznámkový blok pro každý jazyk a předat argumenty při spuštění poznámkového bloku.
- K widgetu se dostanete pomocí
spark.sql()
volání. Například v Pythonu:spark.sql("select getArgument('arg1')").take(1)[0][0]
.
- K widgetu se dostanete pomocí
Poznámka:
Chcete-li uvést $
znak v řetězcovém literálu SQL, použijte \$
. Chcete-li například vyjádřit řetězec $1,000
, použijte "\$1,000"
. Znak $
nemůže být uchycený pro identifikátory SQL.
Použití widgetů Databricks ve službě SQL Warehouse
Tato část popisuje, jak používat widgety Databricks v poznámkovém bloku připojeném k SQL Warehouse. Pokud chcete použít widgety v poznámkovém bloku připojeném k výpočetnímu clusteru, přečtěte si téma Použití widgetů Databricks ve výpočetním clusteru.
Pokud chcete odkazovat na hodnoty widgetu ve službě SQL Warehouse, použijte syntaxi :param
, nikoli $param
. Pokud máte například widget s názvem fare_amount, použijte kód podobný následujícímu:
SELECT * FROM samples.nyctaxi.trips WHERE fare_amount < :fare_amount
IDENTIFIER
Klíčové slovo použijte k identifikaci objektů, jako jsou tabulky, zobrazení, schémata a sloupce. Pokud je například widget s názvem table_name nastaven na samples.nyctaxi.trips
:
SELECT * FROM IDENTIFIER(:table_name)
Podrobnosti najdete v klauzuli IDENTIFIER.
Podrobnosti o syntaxi značky parametru najdete v tématu Značky parametrů.
Konfigurace nastavení widgetu
Při výběru nové hodnoty můžete nakonfigurovat chování widgetů, jestli je panel widgetů vždy připnutý na začátek poznámkového bloku, a změnit rozložení widgetů v poznámkovém bloku.
Klikněte na ikonu na pravém konci panelu widgetů.
V automaticky otevíraných panelech widgetů Nastavení dialogové okno zvolte chování spuštění widgetu.
- Spustit poznámkový blok: Při každém výběru nové hodnoty se celý poznámkový blok znovu spustí.
- Spustit přístupové příkazy: Při každém výběru nové hodnoty se znovu spustí pouze buňky, které načítají hodnoty pro daný widget. Toto je výchozí nastavení při vytváření widgetu. V této konfiguraci se znovu neskutečí buňky SQL.
- Nedělejte nic: Pokaždé, když je vybrána nová hodnota, nic se znovu nes spustí.
Pokud chcete widgety připnout na začátek poznámkového bloku nebo umístit widgety nad první buňku, klikněte na . Nastavení se ukládá na základě jednotlivých uživatelů. Dalším kliknutím na ikonu thumbtacku obnovíte výchozí chování.
Pokud máte oprávnění SPRAVOVAT pro poznámkové bloky, můžete nakonfigurovat rozložení widgetu kliknutím na tlačítko . Pořadí a velikost jednotlivých widgetů je možné přizpůsobit. Chcete-li změny uložit nebo zavřít, klikněte na tlačítko .
Rozložení widgetu se uloží s poznámkovým blokem. Pokud změníte rozložení widgetu z výchozí konfigurace, nebudou nové widgety přidány v abecedním pořadí.
Chcete-li obnovit rozložení widgetu na výchozí pořadí a velikost, kliknutím otevřete dialogové okno Panel widgetů Nastavení a klikněte na tlačítko Obnovit rozložení. Příkaz
removeAll()
neobnoví rozložení widgetu.
Příklad poznámkového bloku
Ukázku toho, jak funguje nastavení Spustit přístupové příkazy , najdete v následujícím poznámkovém bloku. Widget year
se vytvoří s nastavením 2014
a používá se v rozhraní DATAFrame API a příkazech SQL.
Když změníte nastavení widgetu year
na 2007
příkaz DataFrame znovu spustí, ale příkaz SQL se znovu nes spustí.
Tento poznámkový blok znázorňuje použití widgetů v poznámkovém bloku připojeném ke clusteru, nikoli SQL Warehouse.
Poznámkový blok s ukázkou widgetu
Widgety Databricks na řídicích panelech
Když vytvoříte řídicí panel z poznámkového bloku, který obsahuje vstupní widgety, zobrazí se všechny widgety v horní části řídicího panelu. V prezentačním režimu můžete pokaždé, když aktualizujete hodnotu widgetu, kliknout na tlačítko Aktualizovat a znovu spustit poznámkový blok a aktualizovat řídicí panel novými hodnotami.
Použití widgetů Databricks s %run
Pokud spustíte poznámkový blok , který obsahuje widgety, spustí se zadaný poznámkový blok s výchozími hodnotami widgetu.
Pokud je poznámkový blok připojený ke clusteru (to znamená ne SQL Warehouse), můžete také předat hodnoty widgetům. Příklad:
%run /path/to/notebook $X="10" $Y="1"
Tento příklad spustí zadaný poznámkový blok a předá 10
do widgetu X a 1
do widgetu Y.
Omezení
Následující omezení platí pro widgety:
- V poznámkovém bloku lze vytvořit maximálně 512 widgetů.
- Název widgetu je omezený na 1024 znaků.
- Popisek widgetu je omezený na 2048 znaků.
- Do textového widgetu lze zadat maximálně 2048 znaků.
- Pro vícenásobný výběr, pole se seznamem nebo rozevírací widget může být maximálně 1024 možností.
Existuje známý problém, kdy se po stisknutí klávesy Spustit vše nemusí stav widgetu správně vymazat, a to i po vymazání nebo odebrání widgetu v kódu. Pokud k tomu dojde, zobrazí se nesrovnalost mezi vizuálním stavem widgetu a jeho vytištěným stavem. Tento problém můžete obejít opětovným spuštěním buněk jednotlivě. Abyste se tomuto problému zcela vyhnuli, Databricks doporučuje použít ipywidgety.
K stavu widgetu byste neměli přistupovat přímo v asynchronních kontextech, jako jsou vlákna, podprocesy nebo strukturované streamování (foreachBatch), protože stav widgetu se může změnit, když je spuštěn asynchronní kód. Pokud potřebujete získat přístup ke stavu widgetu v asynchronním kontextu, předejte ho jako argument. Pokud máte například následující kód, který používá vlákna:
import threading def thread_func(): # Unsafe access in a thread value = dbutils.widgets.get('my_widget') print(value) thread = threading.Thread(target=thread_func) thread.start() thread.join()
Pak byste ho měli napsat tímto způsobem:
# Access widget values outside the asynchronous context and pass them to the function value = dbutils.widgets.get('my_widget') def thread_func(val): # Use the passed value safely inside the thread print(val) thread = threading.Thread(target=thread_func, args=(value,)) thread.start() thread.join()