Créer des tables delta

Effectué

Quand vous créez une table dans un lakehouse Microsoft Fabric, une table delta est définie dans le metastore pour le lakehouse et les données de la table sont stockées dans les fichiers Parquet sous-jacents de la table.

Avec la plupart des outils interactifs de l’environnement Microsoft Fabric, les détails du mappage de la définition de la table dans le metastore aux fichiers sous-jacents sont abstraits. Toutefois, quand vous utilisez Apache Spark dans un lakehouse, vous disposez d’un contrôle accru pour créer et gérer des tables delta.

Création d’une table delta à partir d’un dataframe

L’une des façons les plus simples de créer une table delta dans Spark consiste à enregistrer un dataframe au format delta. Par exemple, le code PySpark suivant charge un dataframe avec des données à partir d’un fichier existant, puis enregistre ce dataframe sous la forme d’une table delta :

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

Le code spécifie que la table doit être enregistrée au format delta avec un nom de table spécifié. Les données de la table sont enregistrées dans des fichiers Parquet (quel que soit le format du fichier source que vous avez chargé dans le dataframe) dans la zone de stockage Tables du lakehouse ainsi qu’un dossier _delta_log contenant les journaux des transactions de la table. La table est listée dans le dossier Tables du lakehouse dans le volet Explorateur de données.

Tables managées et tables externes

Dans l’exemple précédent, le dataframe a été enregistré en tant que table managée ; cela signifie que la définition de table dans le metastore et les fichiers de données sous-jacents sont gérés par le runtime Spark pour le lakehouse Fabric. La suppression de la table supprime également les fichiers sous-jacents de l’emplacement de stockage Tables pour le lakehouse.

Vous pouvez également créer des tables en tant que tables externes, dans lesquelles la définition de table relationnelle dans le metastore est mappée à un autre emplacement de stockage de fichiers. Par exemple, le code suivant crée une table externe pour laquelle les données sont stockées dans le dossier dans l’emplacement de stockage Fichiers pour le lakehouse :

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

Dans cet exemple, la définition de table est créée dans le metastore (la table est donc listée dans l’interface utilisateur Tables pour le lakehouse), mais les fichiers de données Parquet et les fichiers journaux JSON de la table sont stockés dans l’emplacement de stockage Fichiers (et sont affichés dans le nœud Fichiers dans le volet Explorateur de lakehouse).

Vous pouvez également spécifier le chemin complet d’un emplacement de stockage, comme suit :

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

La suppression d’une table externe du metastore de lakehouse ne supprime pas les fichiers de données associés.

Création de métadonnées de table

Même s’il est courant de créer une table à partir de données existantes dans un dataframe, il existe souvent des scénarios où vous souhaitez créer une définition de table dans le metastore qui est remplie avec des données d’autres façons. Il existe plusieurs façons d’atteindre cet objectif.

Utiliser l’API DeltaTableBuilder

L’API DeltaTableBuilder vous permet d’écrire du code Spark pour créer une table en fonction de vos spécifications. Par exemple, le code suivant crée une table avec un nom et des colonnes spécifiés.

from delta.tables import *

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

Utiliser Spark SQL

Vous pouvez également créer des tables delta avec l’instruction Spark SQL CREATE TABLE, comme illustré dans cet exemple :

%%sql

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

L’exemple précédent crée une table managée. Vous pouvez également créer une table externe en spécifiant un paramètre LOCATION, comme illustré ici :

%%sql

CREATE TABLE MyExternalTable
USING DELTA
LOCATION 'Files/mydata'

Lors de la création d’une table externe, le schéma de la table est déterminé par les fichiers Parquet contenant les données à l’emplacement spécifié. Cette approche peut être utile quand vous souhaitez créer une définition de table qui référence des données qui ont déjà été enregistrées au format delta ou basée sur un dossier dans lequel vous prévoyez d’ingérer des données au format delta.

Enregistrement des données au format delta

Jusqu’à présent, vous avez vu comment enregistrer un dataframe en tant que table delta (création de la définition de schéma de table dans le metastore et des fichiers de données au format delta) et comment créer la définition de table (qui crée le schéma de table dans le metastore sans enregistrer de fichiers de données). Une troisième possibilité consiste à enregistrer des données au format delta sans créer de définition de table dans le metastore. Cette approche peut être utile quand vous souhaitez conserver les résultats des transformations de données effectuées dans Spark dans un format de fichier sur lequel vous pouvez ensuite « superposer » une définition de table ou un processus directement avec l’API Delta Lake.

Par exemple, le code PySpark suivant enregistre un dataframe dans un nouvel emplacement de dossier au format delta :

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

Après avoir enregistré le fichier delta, l’emplacement de chemin que vous avez spécifié inclut les fichiers Parquet contenant les données et un dossier _delta_log contenant les journaux des transactions pour les données. Toutes les modifications apportées aux données via l’API Delta Lake ou dans une table externe créée ultérieurement dans le dossier sont enregistrées dans les journaux des transactions.

Vous pouvez remplacer le contenu d’un dossier existant par les données d’un dataframe avec le mode overwrite, comme illustré ici :

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

Vous pouvez également ajouter des lignes d’un dataframe à un dossier existant avec le mode append :

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

Conseil

Si vous utilisez la technique décrite ici pour enregistrer un dataframe à l’emplacement Tables dans le lakehouse, Microsoft Fabric utilise une fonctionnalité de découverte automatique de table pour créer les métadonnées de table correspondantes dans le metastore.