Släpp eller ersätt en Delta-tabell
Azure Databricks har stöd för SQL-standard-DDL-kommandon för att släppa och ersätta tabeller som registrerats med antingen Unity Catalog eller Hive-metaarkivet. Den här artikeln innehåller exempel på att släppa och ersätta Delta-tabeller och rekommendationer för syntax beroende på din konfigurerade miljö och önskat resultat.
När du ska släppa en tabell
Du bör använda DROP TABLE
för att ta bort en tabell från metaarkivet när du vill ta bort tabellen permanent och inte har för avsikt att skapa en ny tabell på samma plats. Till exempel:
DROP TABLE table_name
DROP TABLE
har olika semantik beroende på typen av tabell och om tabellen är registrerad i Unity Catalog eller det äldre Hive-metaarkivet.
Tabelltyp | Metaarkiv | Funktionssätt |
---|---|---|
Hanterade | Unity Catalog | Tabellen tas bort från metaarkivet och underliggande data markeras för borttagning. Du kan UNDROP data i hanterade Unity Catalog-tabeller i 7 dagar. |
Hanterade | Hive | Tabellen tas bort från metaarkivet och underliggande data tas bort. |
Externt | Unity Catalog | Tabellen tas bort från metaarkivet men underliggande data finns kvar. URI-åtkomstbehörigheter styrs nu av den externa plats som innehåller data. |
Externt | Hive | Tabellen tas bort från metaarkivet men underliggande data finns kvar. Alla URI-åtkomstbehörigheter är oförändrade. |
DROP TABLE
semantik skiljer sig åt mellan olika tabelltyper, och Unity Catalog har en historik över Delta-tabeller med hjälp av ett internt tabell-ID. Alla tabeller delar dock det gemensamma resultatet att det tidigare registrerade tabellnamnet inte längre har en aktiv länk till data och tabellhistorik från metaarkivet när åtgärden har slutförts.
Se SLÄPP TABELL.
Kommentar
Databricks rekommenderar inte mönstret att släppa och sedan återskapa en tabell med samma namn för produktionspipelines eller system, eftersom det här mönstret kan resultera i oväntade resultat för samtidiga åtgärder. Se Ersätt data med samtidiga åtgärder.
När du ska ersätta en tabell
Databricks rekommenderar att du använder CREATE OR REPLACE TABLE
instruktioner för användningsfall där du helt vill skriva över måltabellen med nya data. Om du till exempel vill skriva över en Delta-tabell med alla data från en Parquet-katalog kan du köra följande kommando:
CREATE OR REPLACE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`
CREATE OR REPLACE TABLE
har samma semantik oavsett tabelltyp eller metaarkiv som används. Följande är viktiga fördelar med CREATE OR REPLACE TABLE
:
- Tabellinnehåll ersätts, men tabellidentiteten behålls.
- Tabellhistoriken behålls och du kan återställa tabellen till en tidigare version med
RESTORE
kommandot . - Åtgärden är en enskild transaktion, så det finns aldrig en tid när tabellen inte finns.
- Samtidiga frågor som läser från tabellen kan fortsätta utan avbrott. Eftersom versionen före och efter ersättningen fortfarande finns i tabellhistoriken kan samtidiga frågor referera till någon av tabellernas version efter behov.
Ersätt data med samtidiga åtgärder
När du vill utföra en fullständig ersättning av data i en tabell som kan användas i samtidiga åtgärder måste du använda CREATE OR REPLACE TABLE
.
Följande antimönster bör inte användas:
-- This is an anti-pattern. Avoid doing this!
DROP TABLE IF EXISTS table_name;
CREATE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`;
Orsakerna till den här rekommendationen varierar beroende på om du använder hanterade eller externa tabeller och om du använder Unity Catalog, men för alla Delta-tabelltyper som använder det här mönstret kan det resultera i ett fel, borttagna poster eller skadade resultat.
I stället rekommenderar Databricks att alltid använda CREATE OR REPLACE TABLE
, som i följande exempel:
CREATE OR REPLACE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`
Eftersom tabellhistoriken bibehålls under ersättningen av atomiska data kan samtidiga transaktioner verifiera den version av källtabellen som refereras och därför misslyckas eller stämma av samtidiga transaktioner efter behov utan oväntat beteende eller resultat.