Créer et interroger des tables de catalogue

Effectué

Jusqu’à présent, nous avons considéré les instances de table Delta Lake créées à partir de dataframes et modifiées via l’API Delta Lake. Vous pouvez également définir des tables Delta Lake en tant que tables de catalogue dans le metastore et les utiliser à l’aide de SQL.

Tables externes et managées

Les tables d’un catalogue Spark, y compris les tables Delta Lake, peuvent être managées ou externes ; et il est important de comprendre la distinction entre ces types de table.

  • Une table managée est définie sans emplacement spécifié et les fichiers de données sont stockés dans le stockage utilisé par le metastore. La suppression de la table supprime non seulement ses métadonnées du catalogue, mais également le dossier dans lequel ses fichiers de données sont stockés.
  • Une table externe est définie pour un emplacement de fichier personnalisé, où les données de la table sont stockées. Les métadonnées de la table sont définies dans le catalogue Spark. La suppression de la table supprime les métadonnées du catalogue, mais n’affecte pas les fichiers de données.

Création de tables de catalogue

Il existe plusieurs façons de créer des tables de catalogue.

Création d’une table de catalogue à partir d’un dataframe

Vous pouvez créer des tables managées en écrivant un dataframe à l’aide de l’opération saveAsTable, comme illustré dans les exemples suivants :

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

Création d’une table de catalogue à l’aide de SQL

Vous pouvez également créer une table de catalogue à l’aide de l’instruction SQL CREATE TABLE avec la clause USING DELTA et un paramètre facultatif LOCATION pour les tables externes. Vous pouvez exécuter l’instruction à l’aide de l’API SparkSQL, comme dans l’exemple suivant :

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

Vous pouvez également utiliser la prise en charge SQL native dans Spark pour exécuter l’instruction :

%sql

CREATE TABLE MyExternalTable
USING DELTA
LOCATION '/mydata'

Conseil

L’instruction CREATE TABLE renvoie une erreur si une table avec le nom spécifié existe déjà dans le catalogue. Pour remédier à ce comportement, vous pouvez utiliser une instruction CREATE TABLE IF NOT EXISTS ou l’instruction CREATE OR REPLACE TABLE.

Définition du schéma de table

Dans tous les exemples jusqu’à présent, la table est créée sans schéma explicite. Dans le cas de tables créées en écrivant un dataframe, le schéma de table est hérité du dataframe. Lors de la création d’une table externe, le schéma est hérité de tous les fichiers actuellement stockés dans l’emplacement de la table. Toutefois, lors de la création d’une table managée ou d’une table externe avec un emplacement actuellement vide, vous définissez le schéma de table en spécifiant les noms de colonnes, les types et la nullabilité dans le cadre de l’instruction CREATE TABLE ; comme illustré dans l’exemple suivant :

%sql

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

Lors de l’utilisation de Delta Lake, les schémas de table sont appliqués : les insertions et mises à jour doivent respecter la valeur de nullabilité et les types de données de colonne spécifiés.

Utilisation de l’API DeltaTableBuilder

Vous pouvez utiliser l’API DeltaTableBuilder (qui fait partie de l’API Delta Lake) pour créer une table de catalogue, comme illustré dans l’exemple suivant :

from delta.tables import *

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

De la même façon que l’instruction SQL CREATE TABLE, la méthode create retourne une erreur si une table portant le nom spécifié existe déjà. Vous pouvez remédier à ce comportement en utilisant la méthode createIfNotExists ou createOrReplace.

Utilisation des tables de catalogue

Vous pouvez utiliser des tables de catalogue comme des tables dans n’importe quelle base de données relationnelle SQL, et les interroger et les manipuler à l’aide d’instructions SQL standard. Par exemple, l’exemple de code suivant utilise une instruction SELECT pour interroger la table ManagedSalesOrders :

%sql

SELECT orderid, salestotal
FROM ManagedSalesOrders

Conseil

Pour plus d’informations sur l’utilisation de Delta Lake, consultez Lectures et les écritures par lots de tables dans la documentation Delta Lake.