Erstellen von Katalogtabellen

Abgeschlossen

Bisher haben wir Delta Lake-Tabelleninstanzen betrachtet, die anhand von DataFrames erstellt und über die Delta Lake-API geändert wurden. Sie können Delta Lake-Tabellen auch als Katalogtabellen im Hive-Metastore für Ihren Spark-Pool definieren und mit ihnen mittels SQL arbeiten.

Vergleich von externen und verwalteten Tabellen

Tabellen in einem Spark-Katalog, einschließlich Delta Lake-Tabellen, können verwaltet oder extern sein. Daher ist es wichtig, den Unterschied zwischen diesen beiden Arten von Tabellen zu verstehen.

  • Eine verwaltete Tabelle wird ohne einen angegebenen Speicherort definiert. Die Datendateien werden im vom Metastore verwendeten Speicher gespeichert. Wenn Sie die Tabelle löschen, werden nicht nur ihre Metadaten aus dem Katalog gelöscht, sondern auch der Ordner, in dem ihre Datendateien gespeichert sind.
  • Eine externe Tabelle wird für einen benutzerdefinierten Dateispeicherort definiert, an dem die Daten der Tabelle gespeichert werden. Die Metadaten der Tabelle werden im Spark-Katalog definiert. Beim Löschen der Tabelle werden die Metadaten aus dem Katalog gelöscht, wovon die Datendateien jedoch unberührt bleiben.

Erstellen von Katalogtabellen

Es gibt mehrere Möglichkeiten zum Erstellen von Katalogtabellen.

Erstellen einer Katalogtabelle anhand eines DataFrames

Sie können verwaltete Tabellen erstellen, indem Sie einen DataFrame mithilfe des Vorgangs saveAsTable schreiben, wie in den folgenden Beispielen gezeigt:

# 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")

Erstellen einer Katalogtabelle mithilfe von SQL

Sie können auch eine Katalogtabelle erstellen, indem Sie die SQL-Anweisung CREATE TABLE mit der Klausel USING DELTA und einem optionalen Parameter LOCATION für externe Tabellen ausführen. Sie können die Anweisung wie im folgenden Beispiel mithilfe der SparkSQL-API ausführen:

spark.sql("CREATE TABLE MyExternalTable USING DELTA LOCATION '/mydata'")

Alternativ können Sie die native SQL-Unterstützung in Spark zum Ausführen der Anweisung nutzen:

%%sql

CREATE TABLE MyExternalTable
USING DELTA
LOCATION '/mydata'

Tipp

Die CREATE TABLE-Anweisung gibt einen Fehler zurück, wenn eine Tabelle mit dem angegebenen Namen bereits im Katalog vorhanden ist. Um dieses Verhalten zu vermeiden, können Sie die Anweisung CREATE TABLE IF NOT EXISTS oder CREATE OR REPLACE TABLE verwenden.

Definieren des Tabellenschemas

In allen bisherigen Beispielen wird die Tabelle ohne explizites Schema erstellt. Bei Tabellen, die durch Schreiben eines DataFrames erstellt werden, wird das Tabellenschema vom DataFrame geerbt. Wenn Sie eine externe Tabelle erstellen, wird das Schema von allen Dateien geerbt, die derzeit am Speicherort der Tabelle gespeichert sind. Wenn Sie jedoch eine neue verwaltete Tabelle oder eine externe Tabelle mit einem derzeit leeren Speicherort erstellen, definieren Sie das Tabellenschema, indem Sie wie im folgenden Beispiel die Spaltennamen und -typen sowie die NULL-Zulässigkeit als Teil der CREATE TABLE-Anweisung angeben:

%%sql

CREATE TABLE ManagedSalesOrders
(
    Orderid INT NOT NULL,
    OrderDate TIMESTAMP NOT NULL,
    CustomerName STRING,
    SalesTotal FLOAT NOT NULL
)
USING DELTA

Bei Verwendung von Delta Lake werden Tabellenschemas erzwungen. Alle Einfügungen und Aktualisierungen müssen der angegebenen NULL-Zulässigkeit für Spalten und Datentypen entsprechen.

Verwenden der DeltaTableBuilder-API

Sie können mit der DeltaTableBuilder-API (Teil der Delta Lake-API) eine Katalogtabelle erstellen, wie im folgenden Beispiel gezeigt:

from delta.tables import *

DeltaTable.create(spark) \
  .tableName("default.ManagedProducts") \
  .addColumn("Productid", "INT") \
  .addColumn("ProductName", "STRING") \
  .addColumn("Category", "STRING") \
  .addColumn("Price", "FLOAT") \
  .execute()

Ähnlich wie bei der SQL-Anweisung CREATE TABLE gibt die Methode create einen Fehler zurück, wenn eine Tabelle mit dem angegebenen Namen bereits vorhanden ist. Sie können dieses Verhalten vermeiden, indem Sie die Methode createIfNotExists oder createOrReplace angeben.

Verwenden von Katalogtabellen

Sie können Katalogtabellen wie Tabellen in jeder SQL-basierten relationalen Datenbank verwenden und sie mithilfe von SQL-Standardanweisungen abfragen und ändern. Im folgenden Codebeispiel wird z. B. eine SELECT-Anweisung zur Abfrage der Tabelle ManagedSalesOrders verwendet:

%%sql

SELECT orderid, salestotal
FROM ManagedSalesOrders

Tipp

Weitere Informationen zum Arbeiten mit Delta Lake finden Sie in der Delta Lake-Dokumentation unter Tabelle: Lese-und Schreibvorgänge als Batchvorgang.