Créer des tables dans Unity Catalog

Cet article présente le concept de tables managées et externes dans Unity Catalog et décrit comment créer des tables dans Unity Catalog.

Remarque

Lorsque vous créez une table, veillez à référencer un catalogue régi par Unity Catalog ou à définir le catalogue par défaut sur un catalogue régi par Unity Catalog. Consultez Gérer le catalogue par défaut.

Le catalogue hive_metastore apparaît dans l’explorateur de catalogues mais n’est pas considéré comme régi par Unity Catalog. Il est géré par le metastore Hive de votre espace de travail Azure Databricks. Tous les autres catalogues répertoriés sont régis par Unity Catalog.

Vous pouvez utiliser l’interface de mise à niveau de table Unity Catalog pour mettre à niveau les tables existantes inscrites dans le metastore Hive vers Unity Catalog. Voir Mettre à niveau des tables et des vues vers Unity Catalog.

Tables managées

Les tables managées constituent la méthode par défaut pour créer des tables dans le catalogue Unity. Unity Catalog gère le cycle de vie et la disposition des fichiers pour ces tables. Vous ne devez pas utiliser d’outils en dehors d’Azure Databricks pour manipuler directement des fichiers dans ces tables.

Les tables managées sont stockées dans le stockage managé, au niveau du metastore, du catalogue ou du schéma, selon la façon dont le schéma et le catalogue sont configurés. Consultez Spécifier un emplacement de stockage managé dans Unity Catalog.

Les tables managées utilisent toujours le format de table Delta.

Quand une table managée est supprimée, ses données sous-jacentes sont supprimées de votre locataire cloud dans les 30 jours.

Tables externes

Les tables externes sont des tables dont les données sont stockées en dehors de l’emplacement de stockage managé spécifié pour le metastore, le catalogue ou le schéma. Utilisez des tables externes uniquement quand vous avez besoin d’un accès direct aux données en dehors des clusters Azure Databricks ou des entrepôts Databricks SQL.

Lorsque vous exécutez DROP TABLE sur une table externe, le catalogue Unity ne supprime pas les données sous-jacentes. Vous devez être le propriétaire d’une table pour la supprimer. Vous pouvez gérer les privilèges sur les tables externes et les utiliser dans des requêtes comme vous le feriez avec des tables managées. Pour créer une table externe avec SQL, spécifiez un chemin LOCATION dans votre instruction CREATE TABLE. Les tables externes peuvent utiliser les formats de fichiers suivants :

  • DELTA
  • CSV
  • JSON
  • AVRO
  • PARQUET
  • ORC
  • TEXT

Pour gérer l’accès au stockage cloud sous-jacent pour une table externe, vous devez configurer les informations d’identification de stockage et les emplacements externes.

Pour plus d’informations, consultez créer une table externe.

Spécifications

Vous devez disposer du privilège CREATE TABLE sur le schéma dans lequel vous souhaitez créer la table, ainsi que le privilège USE SCHEMA sur le schéma et le privilègeUSE CATALOG sur le catalogue parent.

Si vous créez une table externe, consultez Créer une table externe pour connaître les autres conditions requises.

Créer une table managée

Pour créer une table managée, exécutez la commande SQL suivante. Vous pouvez également utiliser l' exemple de bloc-notes pour créer une table. Les éléments entre crochets sont optionnels. Remplacez les valeurs d’espace réservé :

  • <catalog-name> : nom du catalogue qui contiendra la table.

    Il ne peut pas s’agir du catalogue hive_metastore créé automatiquement pour le metastore Hive associé à votre espace de travail Azure Databricks. Vous pouvez supprimer le nom du catalogue si vous créez la table dans le catalogue par défaut de l’espace de travail.

  • <schema-name> : nom du schéma qui contiendra la table.

  • <table-name>: Nom pour la table.

  • <column-specification>: Le nom et le type de données de chaque colonne.

SQL

CREATE TABLE <catalog-name>.<schema-name>.<table-name>
(
  <column-specification>
);

Python

spark.sql("CREATE TABLE <catalog-name>.<schema-name>.<table-name> "
  "("
  "  <column-specification>"
  ")")

R

library(SparkR)

sql(paste("CREATE TABLE <catalog-name>.<schema-name>.<table-name> ",
  "(",
  "  <column-specification>",
  ")",
  sep = ""))

Scala

spark.sql("CREATE TABLE <catalog-name>.<schema-name>.<table-name> " +
  "(" +
  "  <column-specification>" +
  ")")

Vous pouvez également créer une table managée avec le fournisseur Databricks Terraform et databricks_table. Vous pouvez récupérer une liste de noms complets de table avec databricks_tables.

Par exemple, pour créer la table main.default.department et y insérer cinq lignes :

SQL

CREATE TABLE main.default.department
(
  deptcode  INT,
  deptname  STRING,
  location  STRING
);

INSERT INTO main.default.department VALUES
  (10, 'FINANCE', 'EDINBURGH'),
  (20, 'SOFTWARE', 'PADDINGTON'),
  (30, 'SALES', 'MAIDSTONE'),
  (40, 'MARKETING', 'DARLINGTON'),
  (50, 'ADMIN', 'BIRMINGHAM');

Python

spark.sql("CREATE TABLE main.default.department "
  "("
  "  deptcode  INT,"
  "  deptname  STRING,"
  "  location  STRING"
  ")"
  "INSERT INTO main.default.department VALUES "
  "  (10, 'FINANCE', 'EDINBURGH'),"
  "  (20, 'SOFTWARE', 'PADDINGTON'),"
  "  (30, 'SALES', 'MAIDSTONE'),"
  "  (40, 'MARKETING', 'DARLINGTON'),"
  "  (50, 'ADMIN', 'BIRMINGHAM')")

R

library(SparkR)

sql(paste("CREATE TABLE main.default.department ",
  "(",
  "  deptcode  INT,",
  "  deptname  STRING,",
  "  location  STRING",
  ")",
  "INSERT INTO main.default.department VALUES ",
  "  (10, 'FINANCE', 'EDINBURGH'),",
  "  (20, 'SOFTWARE', 'PADDINGTON'),",
  "  (30, 'SALES', 'MAIDSTONE'),",
  "  (40, 'MARKETING', 'DARLINGTON'),",
  "  (50, 'ADMIN', 'BIRMINGHAM')",
  sep = ""))

Scala

spark.sql("CREATE TABLE main.default.department " +
  "(" +
  "  deptcode  INT," +
  "  deptname  STRING," +
  "  location  STRING" +
  ")" +
  "INSERT INTO main.default.department VALUES " +
  "  (10, 'FINANCE', 'EDINBURGH')," +
  "  (20, 'SOFTWARE', 'PADDINGTON')," +
  "  (30, 'SALES', 'MAIDSTONE')," +
  "  (40, 'MARKETING', 'DARLINGTON')," +
  "  (50, 'ADMIN', 'BIRMINGHAM')")

Exemple de notebook : Créer des tables managées

Vous pouvez utiliser les exemples de notebooks suivants pour créer un catalogue, un schéma et une table managée, et pour gérer les autorisations relatives à ceux-ci.

Créer et gérer une table dans Unity Catalog au moyen d’un notebook Python

Obtenir le notebook

Créer et gérer une table dans Unity Catalog au moyen d’un notebook SQL

Obtenir le notebook

Annuler une table managée

Vous devez être le propriétaire de la table pour la supprimer. Pour annuler une table managée, exécutez la commande SQL suivante :

DROP TABLE IF EXISTS catalog_name.schema_name.table_name;

Quand une table managée est supprimée, ses données sous-jacentes sont supprimées de votre locataire cloud dans les 30 jours.

Créer une table externe

Les données d’une table externe sont stockées dans un chemin d’accès sur votre locataire Cloud. Pour travailler avec des tables externes, Unity Catalog introduit deux objets pour accéder au stockage cloud externe et l’utiliser :

  • Les informations d’identification de stockage contiennent une méthode d’authentification permettant d’accéder à un emplacement de stockage cloud. Les informations d’identification de stockage ne contiennent pas de mappage au chemin auquel il accorde l’accès. Stockage informations d’identification sont contrôlées par l’accès pour déterminer les utilisateurs qui peuvent utiliser ces informations d’identification.
  • Un emplacement externe mappe les informations d’identification de stockage à un chemin de stockage cloud auquel il accorde l’accès. L’emplacement externe n’accorde l’accès qu’à ce chemin de stockage cloud et à son contenu. Les emplacements externes sont contrôlés par l’accès pour déterminer les utilisateurs qui peuvent les utiliser. Un emplacement externe est utilisé automatiquement lorsque votre commande SQL contient une clause LOCATION.

Spécifications

Pour créer une table externe, vous devez disposer des éléments suivants :

  • Le privilège CREATE EXTERNAL TABLE sur un emplacement externe qui accorde l’accès au LOCATION accessible par la table externe.
  • Autorisation USE SCHEMA sur le schéma parent de la table.
  • Autorisation USE CATALOG sur le catalogue parent de la table.
  • Autorisation CREATE TABLE sur le schéma parent de la table.

Les emplacements externes et les informations d’identification de stockage sont stockés au niveau du metastore, plutôt que dans un catalogue. Pour créer des informations d’identification de stockage, vous devez être administrateur de compte ou disposer du privilège CREATE STORAGE CREDENTIAL. Pour créer un emplacement externe, vous devez être l’administrateur du metastore ou disposer du privilège CREATE EXTERNAL LOCATION. Consultez Se connecter au stockage d’objets cloud à l’aide de Unity Catalog.

Créer une table

Utilisez l’un des exemples de commandes suivants dans un notebook ou l’éditeur de requête SQL pour créer une table externe.

Vous pouvez également utiliser un exemple de notebook pour créer les informations d’identification de stockage, l’emplacement externe et la table externe, et également en gérer les autorisations.

Dans les exemples suivants, remplacez les valeurs d’espace réservé :

  • <catalog>: Nom du catalogue qui contiendra la table.

    Il ne peut pas s’agir du catalogue hive_metastore créé automatiquement pour le metastore Hive associé à votre espace de travail Azure Databricks. Vous pouvez supprimer le nom du catalogue si vous créez la table dans le catalogue par défaut de l’espace de travail.

  • <schema>: Nom du schéma qui contient la table.

  • <table-name>: Nom pour la table.

  • <column-specification>: Le nom et le type de données de chaque colonne.

  • <bucket-path> : Chemin d’accès à l’espace de stockage cloud dans lequel la table sera créée.

  • <table-directory>: Répertoire dans lequel la table sera créée. Utilisez un répertoire unique pour chaque table.

Important

Une fois qu’une table est créée dans un chemin d’accès, les utilisateurs ne peuvent plus accéder directement aux fichiers de ce chemin d’accès à partir d’Azure Databricks, même s’ils ont reçu des privilèges sur un emplacement externe ou des informations d’identification de stockage. Cela permet de s’assurer que les utilisateurs ne peuvent pas contourner les contrôles d’accès appliqués aux tables en lisant directement les fichiers de votre locataire Cloud.

SQL

CREATE TABLE <catalog>.<schema>.<table-name>
(
  <column-specification>
)
LOCATION 'abfss://<bucket-path>/<table-directory>';

Python

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> "
  "("
  "  <column-specification>"
  ") "
  "LOCATION 'abfss://<bucket-path>/<table-directory>'")

R

library(SparkR)

sql(paste("CREATE TABLE <catalog>.<schema>.<table-name> ",
  "(",
  "  <column-specification>",
  ") ",
  "LOCATION 'abfss://<bucket-path>/<table-directory>'",
  sep = ""))

Scala

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> " +
  "(" +
  "  <column-specification>" +
  ") " +
  "LOCATION 'abfss://<bucket-path>/<table-directory>'")

Le catalogue Unity vérifie que vous disposez des autorisations suivantes :

  • CREATE EXTERNAL TABLE sur l’emplacement externe qui fait référence au chemin d’accès de stockage cloud que vous spécifiez.
  • CREATE TABLE sur le schéma parent.
  • USE SCHEMA sur le schéma parent.
  • USE CATALOG sur le catalogue parent.

Si tel est le cas, la table externe est créée. Dans le cas contraire, une erreur se produit et la table externe n’est pas créée.

Notes

Vous pouvez à la place migrer une table externe existante dans le metastore Hive vers le catalogue Unity sans dupliquer ses données. Consultez Mettre à niveau une seule table externe vers Unity Catalog.

Vous pouvez également créer une table externe avec le fournisseur Databricks Terraform et databricks_table. Vous pouvez récupérer une liste de noms complets de table avec databricks_tables.

Exemple de notebook : créer des tables externes

Vous pouvez utiliser l’exemple de notebook suivant pour créer un catalogue, un schéma et une table externe, ainsi que gérer les autorisations sur ceux-ci.

Créer et gérer une table externe dans un notebook Unity Catalog

Obtenir le notebook

Créer une table à partir de fichiers stockés dans votre locataire Cloud

Vous pouvez remplir une table managée ou externe avec des enregistrements de fichiers stockés dans votre locataire Cloud. Le catalogue Unity lit les fichiers à cet emplacement et insère leur contenu dans la table. Dans le catalogue Unity, on parle d’accès basé sur le chemin.

Vous pouvez suivre les exemples de cette section ou utiliser l’interface utilisateur « ajouter des données ».

Explorer le contenu des fichiers.

Pour explorer les données stockées dans un emplacement externe avant de créer des tables à partir de ces données, vous pouvez utiliser Catalog Explorer ou les commandes suivantes.

Autorisations requises: vous devez disposer de l’autorisation READ FILES sur l’emplacement externe associé au chemin d’accès du stockage cloud, une liste des fichiers de données dans cet emplacement est renvoyée.

SQL

  1. Répertoriez les fichiers dans un chemin de stockage cloud :

    LIST 'abfss://<path-to-files>';
    
  2. Interrogez les données des fichiers d’un chemin donné :

    SELECT * FROM <format>.`abfss://<path-to-files>`;
    

Python

  1. Répertoriez les fichiers dans un chemin de stockage cloud :

    display(spark.sql("LIST 'abfss://<path-to-files>'"))
    
  2. Interrogez les données des fichiers d’un chemin donné :

    display(spark.read.load("abfss://<path-to-files>"))
    

R

  1. Répertoriez les fichiers dans un chemin de stockage cloud :

    library(SparkR)
    
    display(sql("LIST 'abfss://<path-to-files>'"))
    
  2. Interrogez les données des fichiers d’un chemin donné :

    library(SparkR)
    
    display(loadDF("abfss://<path-to-files>"))
    

Scala

  1. Répertoriez les fichiers dans un chemin de stockage cloud :

    display(spark.sql("LIST 'abfss://<path-to-files>'"))
    
  2. Interrogez les données des fichiers d’un chemin donné :

    display(spark.read.load("abfss://<path-to-files>"))
    

Crée une table à partir des fichiers

Suivez les exemples de cette section pour créer une table et la remplir avec des fichiers de données sur votre tenant (locataire) cloud.

Notes

Vous pouvez à la place migrer une table externe existante dans le metastore Hive vers le catalogue Unity sans dupliquer ses données. Consultez Mettre à niveau une seule table externe vers Unity Catalog.

Important

  • Lorsque vous créez une table à l’aide de cette méthode, le chemin d’accès de stockage est lu une seule fois, afin d’éviter la duplication des enregistrements. Si vous voulez relire le contenu du répertoire, vous devez supprimer et recréer la table. Pour une table existante, vous pouvez Insérer des enregistrements à partir d’un chemin d’accès de stockage.
  • Un compartiment de stockage dans lequel vous créez une table externe ne peut pas également être utilisé pour lire ou écrire des fichiers de données.
  • Seuls les fichiers figurant dans le répertoire exact sont lus ; la lecture n’est pas récursive.
  • Vous devez disposer des autorisations suivantes :
    • USE CATALOG sur le catalogue parent et USE SCHEMA sur le schéma.
    • CREATE TABLE sur le schéma parent.
    • READ FILES sur l’emplacement externe associé au chemin d’accès du compartiment où se trouvent les fichiers, ou directement sur les informations d’identification de stockage si vous n’utilisez pas d’emplacement externe.
    • Si vous créez une table externe, vous devez disposer CREATE EXTERNAL TABLE du chemin d’accès du compartiment dans lequel la table sera créée.

Pour créer une table managée et la remplir avec des données dans votre stockage cloud, utilisez les exemples suivants.

SQL

CREATE TABLE <catalog>.<schema>.<table-name>
(
  <column-specification>
)
SELECT * from <format>.`abfss://<path-to-files>`;

Python

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> "
  "( "
  "  <column-specification> "
  ") "
  "SELECT * from <format>.`abfss://<path-to-files>`")

R

library(SparkR)

sql(paste("CREATE TABLE <catalog>.<schema>.<table-name> ",
  "( ",
  "  <column-specification> ",
  ") ",
  "SELECT * from <format>.`abfss://<path-to-files>`",
  sep = ""))

Scala

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> " +
  "( " +
  "  <column-specification> " +
  ") " +
  "SELECT * from <format>.`abfss://<path-to-files>`")

Pour créer une table externe et la remplir avec des données dans votre stockage cloud, ajoutez une clause LOCATION :

SQL

CREATE TABLE <catalog>.<schema>.<table-name>
(
    <column-specification>
)
USING <format>
LOCATION 'abfss://<table-location>'
SELECT * from <format>.`abfss://<path-to-files>`;

Python

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> "
  "( "
  "  <column-specification> "
  ") "
  "USING <format> "
  "LOCATION 'abfss://<table-location>' "
  "SELECT * from <format>.`abfss://<path-to-files>`")

R

library(SparkR)

sql(paste("CREATE TABLE <catalog>.<schema>.<table-name> ",
  "( ",
  "  <column-specification> ",
  ") ",
  "USING <format> ",
  "LOCATION 'abfss://<table-location>' ",
  "SELECT * from <format>.`abfss://<path-to-files>`",
  sep = ""))

Scala

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> " +
  "( " +
  "  <column-specification> " +
  ") " +
  "USING <format> " +
  "LOCATION 'abfss://<table-location>' " +
  "SELECT * from <format>.`abfss://<path-to-files>`")

Insérer des enregistrements à partir d’un chemin d’accès dans une table existante

Pour insérer des enregistrements à partir d’un chemin d’accès de compartiment dans une table existante, utilisez la commande COPY INTO. Dans les exemples suivants, remplacez les valeurs d’espace réservé :

  • <catalog>: Nom du catalogue parent de la table.
  • <schema>: Nom du catalogue parent de la table.
  • <path-to-files>: Le chemin d’accès du compartiment qui contient les fichiers de données.
  • <format> : format des fichiers, par exemple delta.
  • <table-location>: Chemin d’accès du compartiment dans lequel la table sera créée.

Important

  • Lorsque vous insérez des enregistrements dans une table à l’aide de cette méthode, le chemin d’accès du compartiment que vous fournissez est lu une seule fois, afin d’éviter la duplication des enregistrements.
  • Un compartiment de stockage dans lequel vous créez une table externe ne peut pas également être utilisé pour lire ou écrire des fichiers de données.
  • Seuls les fichiers figurant dans le répertoire exact sont lus ; la lecture n’est pas récursive.
  • Vous devez disposer des autorisations suivantes :
    • USE CATALOG sur le catalogue parent et USE SCHEMA sur le schéma.
    • MODIFY sur la table.
    • READ FILES sur l’emplacement externe associé au chemin d’accès du compartiment où se trouvent les fichiers, ou directement sur les informations d’identification de stockage si vous n’utilisez pas d’emplacement externe.
    • Pour insérer des enregistrements dans une table externe, vous devez disposer CREATE EXTERNAL TABLE du chemin d’accès du compartiment dans lequel se trouve la table.

Pour insérer des enregistrements de fichiers dans un chemin d’accès de compartiment dans une table managée, à l’aide d’un emplacement externe pour lire à partir du chemin d’accès du compartiment :

SQL

COPY INTO <catalog>.<schema>.<table>
FROM (
  SELECT *
  FROM 'abfss://<path-to-files>'
)
FILEFORMAT = <format>;

Python

spark.sql("COPY INTO <catalog>.<schema>.<table> "
  "FROM ( "
  "  SELECT * "
  "  FROM 'abfss://<path-to-files>' "
  ") "
  "FILEFORMAT = <format>")

R

library(SparkR)

sql(paste("COPY INTO <catalog>.<schema>.<table> ",
  "FROM ( ",
  "  SELECT * ",
  "  FROM 'abfss://<path-to-files>' ",
  ") ",
  "FILEFORMAT = <format>",
  sep = ""))

Scala

spark.sql("COPY INTO <catalog>.<schema>.<table> " +
  "FROM ( " +
  "  SELECT * " +
  "  FROM 'abfss://<path-to-files>' " +
  ") " +
  "FILEFORMAT = <format>")

Pour insérer des éléments dans une table externe, ajoutez une clause LOCATION:

SQL

COPY INTO <catalog>.<schema>.<table>
LOCATION 'abfss://<table-location>'
FROM (
  SELECT *
  FROM 'abfss://<path-to-files>'
)
FILEFORMAT = <format>;

Python

spark.sql("COPY INTO <catalog>.<schema>.<table> "
  "LOCATION 'abfss://<table-location>' "
  "FROM ( "
  "  SELECT * "
  "  FROM 'abfss://<path-to-files>' "
  ") "
  "FILEFORMAT = <format>")

R

library(SparkR)

sql(paste("COPY INTO <catalog>.<schema>.<table> ",
  "LOCATION 'abfss://<table-location>' ",
  "FROM ( ",
  "  SELECT * ",
  "  FROM 'abfss://<path-to-files>' ",
  ") ",
  "FILEFORMAT = <format>",
  sep = ""))

Scala

spark.sql("COPY INTO <catalog>.<schema>.<table> " +
  "LOCATION 'abfss://<table-location>' " +
  "FROM ( " +
  "  SELECT * " +
  "  FROM 'abfss://<path-to-files>' " +
  ") " +
  "FILEFORMAT = <format>")

Ajouter des commentaires à une table

En tant que propriétaire de table ou utilisateur disposant du privilège MODIFY sur une table, vous pouvez ajouter des commentaires à une table et à ses colonnes. Vous pouvez ajouter des commentaires à l’aide de la fonctionnalité suivante :

Étapes suivantes