Sdílet prostřednictvím


Rozšíření typu

Důležité

Tato funkce je ve verzi Public Preview v Databricks Runtime 15.2 a vyšší.

Tabulky s povoleným rozšířením typu umožňují změnit datové typy sloupců na širší typ bez přepsání podkladových datových souborů. Typy sloupců můžete změnit ručně nebo pomocí vývoje schématu vyvíjet typy sloupců.

Rozšíření typu vyžaduje Delta Lake. Všechny spravované tabulky katalogu Unity používají ve výchozím nastavení Delta Lake.

Podporované změny typu

Typy můžete rozšířit podle následujících pravidel:

Source type Podporované širší typy
byte short, int, long, , decimaldouble
short int, long, , decimaldouble
int long, , decimaldouble
long decimal
float double
decimal decimal s větší přesností a škálováním
date timestampNTZ

Chcete-li zabránit náhodnému povýšení celočíselné hodnoty na desetinná místa, je nutné ručně potvrdit změny typu z byte, short, intnebo long do decimal nebo double.

Poznámka:

Při změně libovolného číselného typu na decimalmusí být celková přesnost rovna nebo větší než počáteční přesnost. Pokud také zvětšíte měřítko, celková přesnost se musí zvýšit o odpovídající množství.

Minimální cíl pro byte, shorta int typy je decimal(10,0). Minimální cíl je long decimal(20,0).

Pokud chcete do pole decimal(10,1)přidat dvě desetinná místa, je minimální cíl decimal(12,3).

Změny typu jsou podporovány u sloupců a polí nejvyšší úrovně vnořených uvnitř struktur, map a polí.

Povolení rozšíření typu

Rozšíření typu u existující tabulky můžete povolit nastavením delta.enableTypeWidening vlastnosti tabulky na true:

  ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'true')

Při vytváření tabulky můžete také povolit rozšíření typu:

  CREATE TABLE T(c1 INT) TBLPROPERTIES('delta.enableTypeWidening' = 'true')

Důležité

Když povolíte rozšíření typu, nastaví funkci typeWidening-previewtabulky, která upgraduje protokoly pro čtení a zápis. Pokud chcete pracovat s tabulkami s povoleným rozšířením typu, musíte použít Databricks Runtime 15.2 nebo vyšší. Pokud s tabulkou pracují i externí klienti, ověřte, že tuto funkci tabulky podporují. Podívejte se, jak Azure Databricks spravuje kompatibilitu funkcí Delta Lake?

Ruční použití změny typu

ALTER COLUMN Pomocí příkazu ručně změňte typy:

ALTER TABLE <table_name> ALTER COLUMN <col_name> TYPE <new_type>

Tato operace aktualizuje schéma tabulky bez přepsání podkladových datových souborů.

Rozšiřující typy s automatickým vývojem schématu

Vývoj schématu funguje s rozšířením typu pro aktualizaci datových typů v cílových tabulkách tak, aby odpovídalo typu příchozích dat.

Poznámka:

Bez povoleného rozšíření typu se vývoj schématu vždy pokouší bezpečně downcastovat data tak, aby odpovídala typům sloupců v cílové tabulce. Pokud nechcete v cílových tabulkách automaticky rozšiřovat datové typy, zakažte rozšíření typu před spuštěním úloh s povoleným vývojem schématu.

Pokud chcete použít vývoj schématu k rozšíření datového typu sloupce, musíte splnit následující podmínky:

  • Příkaz používá INSERT nebo MERGE INTO.
  • Příkaz se spustí s povoleným automatickým vývojem schématu.
  • Cílová tabulka má povolený rozšiřující typ.
  • Typ zdrojového sloupce je širší než cílový typ sloupce.
  • Rozšíření typu podporuje změnu typu.

Neshody typů, které nesplňují všechny tyto podmínky, splňují normální pravidla vynucení schématu. Viz vynucení schématu.

Zakázání funkce rozšiřující tabulky typu

Náhodné rozšíření typu u povolených tabulek můžete zabránit nastavením vlastnosti na false:

  ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'false')

Toto nastavení brání budoucím změnám typu v tabulce, ale neodebere funkci rozšiřující tabulky typu ani typy, které se změnily.

Pokud potřebujete úplně odebrat funkce rozšiřující tabulky typu, můžete použít DROP FEATURE příkaz, jak je znázorněno v následujícím příkladu:

 ALTER TABLE <table-name> DROP FEATURE 'typeWidening-preview' [TRUNCATE HISTORY]

Při rozšiřování typu se přepíší všechny datové soubory, které neodpovídají aktuálnímu schématu tabulky. Viz Funkce tabulky Drop Delta.