Vytvoření tabulek katalogu
Zatím jsme zvážili instance tabulek Delta Lake vytvořené z datových rámců a upravili jsme je prostřednictvím rozhraní Delta Lake API. Tabulky Delta Lake můžete také definovat jako tabulky katalogu v metastoru Hive pro váš fond Sparku a pracovat s nimi pomocí SQL.
Externí a spravované tabulky
Tabulky v katalogu Spark, včetně tabulek Delta Lake, je možné spravovat nebo externí. Je důležité pochopit rozdíl mezi těmito druhy tabulek.
- Spravovaná tabulka je definována bez zadaného umístění a datové soubory jsou uloženy v úložišti používaném metastorem. Vyřazení tabulky nejen odebere metadata z katalogu, ale také odstraní složku, ve které jsou uloženy jeho datové soubory.
- Externí tabulka je definována pro vlastní umístění souboru, kde jsou uložena data tabulky. Metadata tabulky jsou definována v katalogu Spark. Vyřazení tabulky odstraní metadata z katalogu, ale nemá vliv na datové soubory.
Vytváření tabulek katalogu
Existuje několik způsobů, jak vytvořit tabulky katalogu.
Vytvoření tabulky katalogu z datového rámce
Spravované tabulky můžete vytvořit zápisem datového rámce pomocí saveAsTable
operace, jak je znázorněno v následujících příkladech:
# Save a dataframe as a managed table
df.write.format("delta").saveAsTable("MyManagedTable")
## specify a path option to save as an external table
df.write.format("delta").option("path", "/mydata").saveAsTable("MyExternalTable")
Vytvoření tabulky katalogu pomocí SQL
Tabulku katalogu můžete vytvořit také pomocí CREATE TABLE
příkazu SQL s USING DELTA
klauzulí a volitelného LOCATION
parametru pro externí tabulky. Příkaz můžete spustit pomocí rozhraní SparkSQL API, například v následujícím příkladu:
spark.sql("CREATE TABLE MyExternalTable USING DELTA LOCATION '/mydata'")
Případně můžete ke spuštění příkazu použít nativní podporu SQL ve Sparku:
%%sql
CREATE TABLE MyExternalTable
USING DELTA
LOCATION '/mydata'
Tip
Příkaz CREATE TABLE
vrátí chybu, pokud tabulka se zadaným názvem již v katalogu existuje. Pokud chcete toto chování zmírnit, můžete použít CREATE TABLE IF NOT EXISTS
příkaz nebo CREATE OR REPLACE TABLE
příkaz.
Definování schématu tabulky
Ve všech dosud uvedených příkladech se tabulka vytvoří bez explicitního schématu. V případě tabulek vytvořených zápisem datového rámce se schéma tabulky dědí z datového rámce. Při vytváření externí tabulky je schéma zděděno ze všech souborů, které jsou aktuálně uloženy v umístění tabulky. Při vytváření nové spravované tabulky nebo externí tabulky s aktuálně prázdným umístěním však definujete schéma tabulky zadáním názvů sloupců, typů a nullability v rámci příkazu CREATE TABLE; jak je znázorněno v následujícím příkladu:
%%sql
CREATE TABLE ManagedSalesOrders
(
Orderid INT NOT NULL,
OrderDate TIMESTAMP NOT NULL,
CustomerName STRING,
SalesTotal FLOAT NOT NULL
)
USING DELTA
Při použití Delta Lake se vynucují schémata tabulek – všechna vložení a aktualizace musí splňovat zadanou hodnotu null sloupce a datové typy.
Použití rozhraní DeltaTableBuilder API
K vytvoření tabulky katalogu můžete použít rozhraní DeltaTableBuilder API (součást rozhraní Delta Lake API), jak je znázorněno v následujícím příkladu:
from delta.tables import *
DeltaTable.create(spark) \
.tableName("default.ManagedProducts") \
.addColumn("Productid", "INT") \
.addColumn("ProductName", "STRING") \
.addColumn("Category", "STRING") \
.addColumn("Price", "FLOAT") \
.execute()
Podobně jako příkaz CREATE TABLE
SQL create
metoda vrátí chybu, pokud tabulka se zadaným názvem již existuje. Toto chování můžete zmírnit pomocí createIfNotExists
metody nebo createOrReplace
metody.
Použití tabulek katalogu
Tabulky katalogu, jako jsou tabulky, můžete použít v libovolné relační databázi založené na SQL, dotazování a manipulaci s nimi pomocí standardních příkazů SQL. Následující příklad kódu například používá SELECT
příkaz k dotazování na tabulku ManagedSalesOrders :
%%sql
SELECT orderid, salestotal
FROM ManagedSalesOrders
Tip
Další informace o práci s Delta Lake najdete v tématu Dávkové čtení a zápisy tabulek v dokumentaci k Delta Lake.