Erstellen von Katalogtabellen
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.