Erstellen von Deltatabellen

Abgeschlossen

Wenn Sie eine Tabelle in einem Microsoft Fabric-Lakehouse erstellen, wird im Metastore für das Lakehouse eine Deltatabelle definiert, und die Daten für die Tabelle werden in den zugrunde liegenden Parquet-Dateien für die Tabelle gespeichert.

Bei den meisten interaktiven Tools in der Microsoft Fabric-Umgebung werden die Zuordnungsdetails der Tabellendefinition im Metastore zu den zugrunde liegenden Dateien abstrahiert. Wenn Sie jedoch mit Apache Spark in einem Lakehouse arbeiten, haben Sie eine bessere Kontrolle über die Erstellung und Verwaltung von Deltatabellen.

Erstellen einer Deltatabelle über einen Dataframe

Eine der einfachsten Möglichkeiten zum Erstellen einer Deltatabelle in Spark besteht darin, einen Dataframe im Deltaformat zu speichern. Der folgende PySpark-Code lädt zum Beispiel einen Dataframe mit Daten aus einer bestehenden Datei und speichert diesen dann als Deltatabelle:

# Load a file into a dataframe
df = spark.read.load('Files/mydata.csv', format='csv', header=True)

# Save the dataframe as a delta table
df.write.format("delta").saveAsTable("mytable")

Der Code gibt an, dass die Tabelle im Deltaformat mit einem angegebenen Tabellennamen gespeichert werden soll. Die Daten für die Tabelle werden in Parquet-Dateien (unabhängig vom Format der Quelldatei, die Sie in den Dataframe geladen haben) im Speicherbereich Tabellen im Lakehouse gespeichert, zusammen mit dem Ordner _delta_log, der die Transaktionsprotokolle für die Tabelle enthält. Die Tabelle wird im Ordner Tabellen für das Lakehouse im Bereich Daten-Explorer aufgeführt.

Vergleich von verwalteten und externen Tabellen

Im vorherigen Beispiel wurde der Dataframe als verwaltete Tabelle gespeichert. Dies bedeutet, dass die Tabellendefinition im Metastore und die zugrunde liegenden Datendateien beide von der Spark-Runtime für das Fabric-Lakehouse verwaltet werden. Beim Löschen der Tabelle werden auch die zugrunde liegenden Dateien aus dem Speicherort Tabellen für das Lakehouse gelöscht.

Sie können Tabellen auch als externe Tabellen erstellen, in denen die Definition der relationalen Tabelle im Metastore einem alternativen Dateispeicherort zugeordnet wird. Mit dem folgenden Code wird beispielsweise eine externe Tabelle erstellt, für die die Daten im Ordner am Speicherort Dateien für das Lakehouse gespeichert sind:

df.write.format("delta").saveAsTable("myexternaltable", path="Files/myexternaltable")

In diesem Beispiel wird die Tabellendefinition im Metastore erstellt (daher wird die Tabelle auf der Tabellen-Benutzeroberfläche für das Lakehouse aufgeführt), aber die Parquet-Datendateien und JSON-Protokolldateien für die Tabelle werden am Speicherort Dateien gespeichert (und werden im Bereich Lakehouse-Explorer im Knoten Dateien angezeigt).

Sie können auch wie folgt einen vollqualifizierten Pfad für einen Speicherort angeben:

df.write.format("delta").saveAsTable("myexternaltable", path="abfss://my_store_url..../myexternaltable")

Beim Löschen einer externen Tabelle aus dem Lakehouse-Metastore werden die zugeordneten Datendateien nicht gelöscht.

Erstellen von Tabellenmetadaten

Obwohl es üblich ist, eine Tabelle aus vorhandenen Daten in einem Dataframe zu erstellen, gibt es häufig Szenarios, in denen Sie eine Tabellendefinition im Metastore erstellen möchten, der auf andere Weise mit Daten aufgefüllt wird. Es gibt mehrere Möglichkeiten, dieses Ziel zu erreichen.

Verwenden der DeltaTableBuilder-API

Mit der DeltaTableBuilder-API können Sie Spark-Code schreiben, um eine Tabelle basierend auf Ihren Spezifikationen zu erstellen. Der folgende Code erstellt beispielsweise eine Tabelle mit einem angegebenen Namen und Spalten.

from delta.tables import *

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

Verwenden von Spark SQL

Sie können Deltatabellen wie in diesem Beispiel gezeigt auch mithilfe der Spark SQL-Anweisung CREATE TABLE erstellen:

%%sql

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

Im vorherigen Beispiel wird eine verwaltete Tabelle erstellt. Sie können auch eine externe Tabelle erstellen, indem Sie wie hier gezeigt einen LOCATION-Parameter angeben:

%%sql

CREATE TABLE MyExternalTable
USING DELTA
LOCATION 'Files/mydata'

Beim Erstellen einer externen Tabelle wird das Schema der Tabelle durch die Parquet-Dateien bestimmt, die die Daten am angegebenen Speicherort enthalten. Dieser Ansatz kann nützlich sein, wenn Sie eine Tabellendefinition erstellen möchten, die auf Daten verweist, die bereits im Deltaformat gespeichert wurden, oder basierend auf einem Ordner, in dem Sie Daten im Deltaformat erfassen möchten.

Speichern von Daten im Deltaformat

Bisher haben Sie erfahren, wie Sie einen Dataframe als Deltatabelle speichern (Erstellen der Tabellenschemadefinition im Metastore und der Datendateien im Deltaformat) und wie Sie die Tabellendefinition erstellen (die das Tabellenschema im Metastore erstellt, ohne Datendateien zu speichern). Eine dritte Möglichkeit besteht darin, Daten im Deltaformat zu speichern, ohne eine Tabellendefinition im Metastore zu erstellen. Dieser Ansatz kann nützlich sein, wenn Sie die Ergebnisse von Datentransformationen, die in Spark ausgeführt werden, in einem Dateiformat speichern möchten, das Sie später mithilfe der Delta-Lake-API direkt mit einer Tabellendefinition oder einem Prozess „überlagern“ können.

Mit dem folgenden PySpark-Code wird beispielsweise ein Dataframe an einem neuen Ordnerspeicherort im Deltaformat gespeichert:

delta_path = "Files/mydatatable"
df.write.format("delta").save(delta_path)

Delta-Dateien werden im Parquet-Format im angegebenen Pfad gespeichert und enthalten den Ordner _delta_log mit Transaktionsprotokolldateien. Transaktionsprotokolle zeichnen alle Änderungen in den Daten auf, z. B. Aktualisierungen, die an externen Tabellen oder über die Delta Lake-API vorgenommen wurden.

Sie können den Inhalt eines vorhandenen Ordners wie folgt mithilfe des Modus Überschreiben durch die Daten in einem Dataframe ersetzen:

new_df.write.format("delta").mode("overwrite").save(delta_path)

Mithilfe des Anfügemodus können Sie einem vorhandenen Ordner auch Zeilen aus einem Dataframe hinzufügen:

new_rows_df.write.format("delta").mode("append").save(delta_path)

Tipp

Wenn Sie die hier beschriebene Technik verwenden, um einen Dataframe am Speicherort Tabellen im Lakehouse zu speichern, verwendet Microsoft Fabric eine Funktion zur automatischen Tabellenermittlung, um die entsprechenden Tabellenmetadaten im Metastore zu erstellen.