Partager via


Créer des vues

Cet article explique comment créer des vues dans Unity Catalog.

Une vue est un objet en lecture seule composé d’une ou plusieurs tables et vues dans un metastore. Elle réside dans la troisième couche de l’espace de noms à trois niveaux de Unity Catalog. Une vue peut être créée à partir de tables et d’autres vues dans plusieurs schémas ou catalogues.

Les vues dynamiques peuvent être utilisées pour fournir un contrôle d’accès au niveau des lignes et des colonnes, en plus du masquage des données.

Exemple de syntaxe pour la création d’une vue :

CREATE VIEW main.default.experienced_employee
  (id COMMENT 'Unique identification number', Name)
  COMMENT 'View for experienced employees'
AS SELECT id, name
   FROM all_employee
   WHERE working_years > 5;

Remarque

Les vues peuvent avoir une sémantique d’exécution différente si elles sont basées sur des sources de données autres que des tables Delta. Databricks recommande de toujours définir des vues en référençant des sources de données à l’aide d’un nom de table ou de vue. La définition de vues sur des jeux de données en spécifiant un chemin d’accès ou un URI peut entraîner des exigences de gouvernance des données déroutantes.

Spécifications

Pour créer une vue :

  • Vous devez disposer de l’autorisation USE CATALOG sur le catalogue parent et des autorisations USE SCHEMA et CREATE TABLE sur le schéma parent. Un administrateur de metastore ou le propriétaire du catalogue peut vous octroyer tous ces privilèges. Un propriétaire de schéma peut vous octroyer les privilèges USE SCHEMA et CREATE TABLE sur le schéma.
  • Vous devez pouvoir lire les tables et les vues référencées dans la vue (SELECT sur la table ou la vue, ainsi que USE CATALOG sur le catalogue et USE SCHEMA sur le schéma).
  • Si une vue fait référence à des tables du metastore Hive local à l’espace de travail, la vue est uniquement accessible à partir de l’espace de travail qui contient les tables locales à l’espace de travail. Par conséquent, Databricks recommande de ne créer des vues qu’à partir de tables ou de vues qui se trouvent dans le metastore Unity Catalog.
  • Vous ne pouvez pas créer une vue faisant référence à une vue qui a été partagée avec vous à l'aide du partage Delta. Consultez Partager des données et des ressources IA de façon sécurisée à l’aide du partage Delta.

Pour lire une vue, les autorisations requises dépendent du mode d’accès et du type de calcul :

  • Pour les clusters partagés et les entrepôts SQL, vous avez besoin de SELECT dans la vue elle-même, de USE CATALOG dans son catalogue parent et de USE SCHEMA dans son schéma parent.
  • Pour les clusters mono-utilisateurs, vous devez également disposer de SELECT dans toutes les tables et vues référencées par la vue, en plus du USE CATALOG dans leurs catalogues parents et de USE SCHEMA dans leurs schémas parents.

Pour créer ou lire des vues dynamiques :

  • Les exigences pour les vues dynamiques sont identiques à celles répertoriées dans les sections précédentes, sauf que vous devez utiliser un cluster partagé ou un entrepôt SQL pour créer ou lire une vue dynamique. Vous ne pouvez pas utiliser des clusters mono-utilisateur.

Créer une vue

Pour créer une vue, exécutez la commande SQL suivante. Les éléments entre chevrons sont optionnels. Remplacez les valeurs d’espace réservé :

  • <catalog-name>: Nom du catalogue.
  • <schema-name> : nom du schéma.
  • <view-name> : Nom de la vue.
  • <query> : La requête, les colonnes, les tables et les vues utilisées pour composer la vue.

SQL

CREATE VIEW <catalog-name>.<schema-name>.<view-name> AS
SELECT <query>;

Python

spark.sql("CREATE VIEW <catalog-name>.<schema-name>.<view-name> AS "
  "SELECT <query>")

R

library(SparkR)

sql(paste("CREATE VIEW <catalog-name>.<schema-name>.<view-name> AS ",
  "SELECT <query>",
  sep = ""))

Scala

spark.sql("CREATE VIEW <catalog-name>.<schema-name>.<view-name> AS " +
  "SELECT <query>")

Par exemple, pour créer une vue nommée sales_redacted à partir des colonnes de la table sales_raw :

SQL

CREATE VIEW sales_metastore.sales.sales_redacted AS
SELECT
  user_id,
  email,
  country,
  product,
  total
FROM sales_metastore.sales.sales_raw;

Python

spark.sql("CREATE VIEW sales_metastore.sales.sales_redacted AS "
  "SELECT "
  "  user_id, "
  "  email, "
  "  country, "
  "  product, "
  "  total "
  "FROM sales_metastore.sales.sales_raw")

R

library(SparkR)

sql(paste("CREATE VIEW sales_metastore.sales.sales_redacted AS ",
  "SELECT ",
  "  user_id, ",
  "  email, ",
  "  country, ",
  "  product, ",
  "  total ",
  "FROM sales_metastore.sales.sales_raw",
  sep = ""))

Scala

spark.sql("CREATE VIEW sales_metastore.sales.sales_redacted AS " +
  "SELECT " +
  "  user_id, " +
  "  email, " +
  "  country, " +
  "  product, " +
  "  total " +
  "FROM sales_metastore.sales.sales_raw")

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

Créer une vue dynamique

Dans Unity Catalog, vous pouvez utiliser des vues dynamiques pour configurer un contrôle d’accès affiné, notamment :

  • Sécurité au niveau des colonnes ou des lignes
  • Masquage des données

Notes

Le contrôle d’accès affiné à l’aide de vues dynamiques n’est pas disponible sur les clusters en mode d’accèsUtilisateur unique.

Unity Catalog introduit les fonctions suivantes, qui vous permettent de limiter de manière dynamique les utilisateurs qui peuvent accéder à une ligne, une colonne ou un enregistrement dans une vue :

  • current_user() : renvoie l’adresse e-mail de l’utilisateur actuel.
  • is_account_group_member() : renvoie TRUE si l’utilisateur actuel est membre d’un groupe de niveau compte spécifique. Recommandé pour une utilisation dans les vues dynamiques par rapport aux données Unity Catalog.
  • is_member() : renvoie TRUE si l’utilisateur actuel est membre d’un groupe spécifique au niveau de l’espace de travail. Cette fonction est fournie à des fins de compatibilité avec le metastore Hive existant. Évitez de l’utiliser avec des vues sur des données Unity Catalog, car elle n’évalue pas l’appartenance au groupe de niveau compte.

Azure Databricks recommande de ne pas accorder aux utilisateurs la possibilité de lire les tables et les vues référencées dans la vue.

Les exemples suivants illustrent la création de vues dynamiques dans Unity Catalog.

Autorisations au niveau de la colonne

Avec une vue dynamique, vous pouvez limiter les colonnes auxquelles un utilisateur ou un groupe spécifique peut accéder. Dans l’exemple suivant, seuls les membres du groupe auditors peuvent accéder aux adresses e-mail à partir de la table sales_raw. Au cours de l’analyse des requêtes, Apache Spark remplace l’instruction CASE par la chaîne littérale REDACTED ou le contenu réel de la colonne d’adresses e-mail. Les autres colonnes sont renvoyées normalement. Cette stratégie n’a pas d’impact négatif sur les performances des requêtes.

SQL

-- Alias the field 'email' to itself (as 'email') to prevent the
-- permission logic from showing up directly in the column name results.
CREATE VIEW sales_redacted AS
SELECT
  user_id,
  CASE WHEN
    is_account_group_member('auditors') THEN email
    ELSE 'REDACTED'
  END AS email,
  country,
  product,
  total
FROM sales_raw

Python

# Alias the field 'email' to itself (as 'email') to prevent the
# permission logic from showing up directly in the column name results.
spark.sql("CREATE VIEW sales_redacted AS "
  "SELECT "
  "  user_id, "
  "  CASE WHEN "
  "    is_account_group_member('auditors') THEN email "
  "  ELSE 'REDACTED' "
  "  END AS email, "
  "  country, "
  "  product, "
  "  total "
  "FROM sales_raw")

R

library(SparkR)

# Alias the field 'email' to itself (as 'email') to prevent the
# permission logic from showing up directly in the column name results.
sql(paste("CREATE VIEW sales_redacted AS ",
  "SELECT ",
  "  user_id, ",
  "  CASE WHEN ",
  "    is_account_group_member('auditors') THEN email ",
  "  ELSE 'REDACTED' ",
  "  END AS email, ",
  "  country, ",
  "  product, ",
  "  total ",
  "FROM sales_raw",
  sep = ""))

Scala

// Alias the field 'email' to itself (as 'email') to prevent the
// permission logic from showing up directly in the column name results.
spark.sql("CREATE VIEW sales_redacted AS " +
  "SELECT " +
  "  user_id, " +
  "  CASE WHEN " +
  "    is_account_group_member('auditors') THEN email " +
  "  ELSE 'REDACTED' " +
  "  END AS email, " +
  "  country, " +
  "  product, " +
  "  total " +
  "FROM sales_raw")

Autorisations au niveau des lignes

Avec une vue dynamique, vous pouvez spécifier des autorisations jusqu’au niveau de la ligne ou du champ. Dans l’exemple suivant, seuls les membres du groupe managers peuvent afficher les montants des transactions lorsqu’ils dépassent 1 million de dollars. Les résultats correspondants sont filtrés et non visibles par les autres utilisateurs.

SQL

 CREATE VIEW sales_redacted AS
 SELECT
   user_id,
   country,
   product,
   total
 FROM sales_raw
 WHERE
   CASE
     WHEN is_account_group_member('managers') THEN TRUE
     ELSE total <= 1000000
   END;

Python

 spark.sql("CREATE VIEW sales_redacted AS "
   "SELECT "
   "  user_id, "
   "  country, "
   "  product, "
   "  total "
   "FROM sales_raw "
   "WHERE "
   "CASE "
   "  WHEN is_account_group_member('managers') THEN TRUE "
   "  ELSE total <= 1000000 "
   "END")

R

 library(SparkR)

 sql(paste("CREATE VIEW sales_redacted AS ",
   "SELECT ",
   "  user_id, ",
   "  country, ",
   "  product, ",
   "  total ",
   "FROM sales_raw ",
   "WHERE ",
   "CASE ",
   "  WHEN is_account_group_member('managers') THEN TRUE ",
   "  ELSE total <= 1000000 ",
   "END",
   sep = ""))

Scala

 spark.sql("CREATE VIEW sales_redacted AS " +
   "SELECT " +
   "  user_id, " +
   "  country, " +
   "  product, " +
   "  total " +
   "FROM sales_raw " +
   "WHERE " +
   "CASE " +
   "  WHEN is_account_group_member('managers') THEN TRUE " +
   "  ELSE total <= 1000000 " +
   "END")

Masquage de données

Étant donné que les vues dans Unity Catalog utilisent Spark SQL, vous pouvez implémenter le masquage des données avancé à l’aide d’expressions SQL et d’expressions régulières plus complexes. Dans l’exemple suivant, tous les utilisateurs peuvent analyser des domaines de courrier, mais seuls les membres du groupe auditors peuvent afficher l’adresse e-mail entière d’un utilisateur.

SQL

-- The regexp_extract function takes an email address such as
-- user.x.lastname@example.com and extracts 'example', allowing
-- analysts to query the domain name.

CREATE VIEW sales_redacted AS
SELECT
  user_id,
  region,
  CASE
    WHEN is_account_group_member('auditors') THEN email
    ELSE regexp_extract(email, '^.*@(.*)$', 1)
  END
  FROM sales_raw

Python

# The regexp_extract function takes an email address such as
# user.x.lastname@example.com and extracts 'example', allowing
# analysts to query the domain name.

spark.sql("CREATE VIEW sales_redacted AS "
  "SELECT "
  "  user_id, "
  "  region, "
  "  CASE "
  "    WHEN is_account_group_member('auditors') THEN email "
  "    ELSE regexp_extract(email, '^.*@(.*)$', 1) "
  "  END "
  "  FROM sales_raw")

R

library(SparkR)

# The regexp_extract function takes an email address such as
# user.x.lastname@example.com and extracts 'example', allowing
# analysts to query the domain name.

sql(paste("CREATE VIEW sales_redacted AS ",
  "SELECT ",
  "  user_id, ",
  "  region, ",
  "  CASE ",
  "    WHEN is_account_group_member('auditors') THEN email ",
  "    ELSE regexp_extract(email, '^.*@(.*)$', 1) ",
  "  END ",
  "  FROM sales_raw",
  sep = ""))

Scala

// The regexp_extract function takes an email address such as
// user.x.lastname@example.com and extracts 'example', allowing
// analysts to query the domain name.

spark.sql("CREATE VIEW sales_redacted AS " +
  "SELECT " +
  "  user_id, " +
  "  region, " +
  "  CASE " +
  "    WHEN is_account_group_member('auditors') THEN email " +
  "    ELSE regexp_extract(email, '^.*@(.*)$', 1) " +
  "  END " +
  "  FROM sales_raw")

Supprimer une vue

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

DROP VIEW IF EXISTS catalog_name.schema_name.view_name;

Étapes suivantes