Delta-tabellen maken

Voltooid

Wanneer u een tabel maakt in een Microsoft Fabric Lakehouse, wordt een deltatabel gedefinieerd in de metastore voor lakehouse en worden de gegevens voor de tabel opgeslagen in de onderliggende Parquet-bestanden voor de tabel.

Met de meeste interactieve hulpprogramma's in de Microsoft Fabric-omgeving worden de details van het toewijzen van de tabeldefinitie in de metastore aan de onderliggende bestanden geabstraheerd. Wanneer u echter met Apache Spark in een lakehouse werkt, hebt u meer controle over het maken en beheren van deltatabellen.

Een deltatabel maken op basis van een dataframe

Een van de eenvoudigste manieren om een deltatabel in Spark te maken, is door een dataframe op te slaan in de delta-indeling . Met de volgende PySpark-code wordt bijvoorbeeld een dataframe geladen met gegevens uit een bestaand bestand en wordt dat dataframe vervolgens opgeslagen als een deltatabel:

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

De code geeft aan dat de tabel moet worden opgeslagen in delta-indeling met een opgegeven tabelnaam. De gegevens voor de tabel worden opgeslagen in Parquet-bestanden (ongeacht de indeling van het bronbestand dat u in het dataframe hebt geladen) in het opslaggebied Tabellen in lakehouse, samen met een _delta_log map met de transactielogboeken voor de tabel. De tabel wordt weergegeven in de map Tabellen voor het lakehouse in het deelvenster Data Explorer .

Beheerde versus externe tabellen

In het vorige voorbeeld is het dataframe opgeslagen als een beheerde tabel. Dit betekent dat de tabeldefinitie in de metastore en de onderliggende gegevensbestanden beide worden beheerd door de Spark-runtime voor het Fabric Lakehouse. Als u de tabel verwijdert, worden ook de onderliggende bestanden verwijderd uit de opslaglocatie Tabellen voor het lakehouse.

U kunt ook tabellen maken als externe tabellen, waarin de definitie van de relationele tabel in de metastore is toegewezen aan een alternatieve bestandsopslaglocatie. Met de volgende code wordt bijvoorbeeld een externe tabel gemaakt waarvoor de gegevens worden opgeslagen in de map in de opslaglocatie Bestanden voor lakehouse:

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

In dit voorbeeld wordt de tabeldefinitie gemaakt in de metastore (dus de tabel wordt weergegeven in de gebruikersinterface Tabellen voor lakehouse), maar de Parquet-gegevensbestanden en JSON-logboekbestanden voor de tabel worden opgeslagen in de opslaglocatie Bestanden (en worden weergegeven in het knooppunt Bestanden in het deelvenster Lakehouse Explorer).

U kunt ook een volledig gekwalificeerd pad opgeven voor een opslaglocatie, zoals deze:

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

Als u een externe tabel verwijdert uit de lakehouse-metastore , worden de bijbehorende gegevensbestanden niet verwijderd.

Tabelmetagegevens maken

Hoewel het gebruikelijk is om een tabel te maken op basis van bestaande gegevens in een dataframe, zijn er vaak scenario's waarin u een tabeldefinitie wilt maken in de metastore die op andere manieren wordt gevuld met gegevens. Er zijn meerdere manieren waarop u dit doel kunt bereiken.

De DeltaTableBuilder-API gebruiken

Met de DeltaTableBuilder-API kunt u Spark-code schrijven om een tabel te maken op basis van uw specificaties. Met de volgende code wordt bijvoorbeeld een tabel gemaakt met een opgegeven naam en kolommen.

from delta.tables import *

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

Spark SQL gebruiken

U kunt ook deltatabellen maken met behulp van de Spark SQL-instructie CREATE TABLE , zoals wordt weergegeven in dit voorbeeld:

%%sql

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

In het vorige voorbeeld wordt een beheerde tabel gemaakt. U kunt ook een externe tabel maken door een LOCATION parameter op te geven, zoals hier wordt weergegeven:

%%sql

CREATE TABLE MyExternalTable
USING DELTA
LOCATION 'Files/mydata'

Bij het maken van een externe tabel wordt het schema van de tabel bepaald door de Parquet-bestanden met de gegevens op de opgegeven locatie. Deze methode kan handig zijn als u een tabeldefinitie wilt maken die verwijst naar gegevens die al zijn opgeslagen in delta-indeling, of op basis van een map waarin u verwacht gegevens op te nemen in delta-indeling.

Gegevens opslaan in delta-indeling

Tot nu toe hebt u gezien hoe u een dataframe opslaat als een deltatabel (door zowel de tabelschemadefinitie in de metastore als de gegevensbestanden in delta-indeling te maken) en hoe u de tabeldefinitie maakt (waarmee het tabelschema in de metastore wordt gemaakt zonder dat er gegevensbestanden worden opgeslagen). Een derde mogelijkheid is om gegevens op te slaan in delta-indeling zonder een tabeldefinitie te maken in de metastore. Deze benadering kan handig zijn als u de resultaten van gegevenstransformaties die in Spark worden uitgevoerd, wilt behouden in een bestandsindeling waarvoor u later een tabeldefinitie of -proces kunt 'overlayen' met behulp van de Delta Lake-API.

Met de volgende PySpark-code wordt bijvoorbeeld een dataframe opgeslagen in een nieuwe maplocatie in delta-indeling :

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

Delta-bestanden worden opgeslagen in parquet-indeling in het opgegeven pad en bevatten een _delta_log map met transactielogboekbestanden. Transactielogboeken registreren eventuele wijzigingen in de gegevens, zoals updates die zijn aangebracht in externe tabellen of via de Delta Lake-API.

U kunt de inhoud van een bestaande map vervangen door de gegevens in een dataframe met behulp van de overschrijfmodus , zoals hier wordt weergegeven:

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

U kunt ook rijen uit een dataframe toevoegen aan een bestaande map met behulp van de toevoegmodus :

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

Tip

Als u de techniek gebruikt die hier wordt beschreven om een dataframe op te slaan op de locatie Tabellen in lakehouse, gebruikt Microsoft Fabric een functie voor automatische tabeldetectie om de bijbehorende tabelmetagegevens in de metastore te maken.