Creare viste

Questo articolo illustra come creare visualizzazioni in Unity Catalog.

Una vista è un oggetto di sola lettura composto da una o più tabelle e viste in un metastore. Si trova nel terzo livello dello spazio dei nomi a tre livelli di Unity Catalog. È possibile creare una vista da tabelle e altre viste in più schemi e cataloghi.

Le visualizzazioni dinamiche possono essere usate per fornire il controllo di accesso a livello di riga e colonna, oltre alla maschera dati.

Sintassi di esempio per la creazione di una vista:

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;

Nota

Le viste possono avere una semantica di esecuzione diversa se sono supportate da origini dati diverse da tabelle Delta. Databricks consiglia di definire sempre le viste facendo riferimento alle origini dati usando un nome di tabella o vista. La definizione di visualizzazioni rispetto ai set di dati specificando un percorso o un URI può causare problemi di governance dei dati confusi.

Requisiti

Per creare una visualizzazione:

  • È necessario disporre dell'autorizzazione USE CATALOG per il catalogo padre e le USE SCHEMA autorizzazioni e CREATE TABLE per lo schema padre. Un amministratore del metastore o il proprietario del catalogo può concedere tutti questi privilegi. Un proprietario dello schema può concedere USE SCHEMA l'utente e CREATE TABLE i privilegi per lo schema.
  • È necessario avere la possibilità di leggere le tabelle e le viste a cui si fa riferimento nella vista (SELECT nella tabella o nella vista, nonché USE CATALOG nel catalogo e USE SCHEMA nello schema).
  • Se una vista fa riferimento alle tabelle nel metastore Hive locale dell'area di lavoro, è possibile accedere alla vista solo dall'area di lavoro che contiene le tabelle locali dell'area di lavoro. Per questo motivo, Databricks consiglia di creare visualizzazioni solo da tabelle o viste presenti nel metastore di Unity Catalog.
  • Non è possibile creare una vista che faccia riferimento a una visualizzazione condivisa con l'utente usando la condivisione delta. Vedere Condividere i dati e gli asset di intelligenza artificiale in modo sicuro usando la condivisione Delta.

Per leggere una visualizzazione, le autorizzazioni necessarie dipendono dalla modalità di accesso al cluster:

  • Per i cluster condivisi, è necessario SELECT nella vista stessa, USE CATALOG nel catalogo padre e USE SCHEMA nello schema padre.
  • Per i cluster a utente singolo, è necessario disporre SELECT anche di tutte le tabelle e viste a cui fa riferimento la vista, oltre ai USE CATALOG cataloghi padre e USE SCHEMA ai relativi schemi padre.

Non è possibile creare o leggere visualizzazioni dinamiche usando cluster a utente singolo.

Crea una visualizzazione

Per creare una vista, eseguire il comando SQL seguente. Gli elementi tra parentesi quadre sono facoltativi. Sostituire i valori segnaposto:

  • <catalog-name>: nome del catalogo.
  • <schema-name>: nome dello schema.
  • <view-name>: nome della visualizzazione.
  • <query>: query, colonne e tabelle e viste usate per comporre la vista.

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

Ad esempio, per creare una vista denominata sales_redacted da colonne nella sales_raw tabella:

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

È anche possibile creare una vista usando il provider Databricks Terraform e databricks_table. È possibile recuperare un elenco di nomi completi della visualizzazione usando databricks_views.

Creare una visualizzazione dinamica

In Unity Catalog è possibile usare le visualizzazioni dinamiche per configurare il controllo di accesso con granularità fine, tra cui:

  • Sicurezza a livello di colonne o righe.
  • Maschera dati.

Nota

Il controllo di accesso con granularità fine tramite le visualizzazioni dinamiche non è disponibile nei cluster con modalità di accesso utentesingolo.

Unity Catalog introduce le funzioni seguenti, che consentono di limitare in modo dinamico gli utenti che possono accedere a una riga, una colonna o un record in una visualizzazione:

  • current_user(): restituisce l'indirizzo di posta elettronica dell'utente corrente.
  • is_account_group_member(): restituisce TRUE se l'utente corrente è membro di un gruppo a livello di account specifico. Consigliato per l'uso nelle visualizzazioni dinamiche sui dati di Unity Catalog.
  • is_member(): restituisce TRUE se l'utente corrente è membro di un gruppo a livello di area di lavoro specifico. Questa funzione viene fornita per la compatibilità con il metastore Hive esistente. Evitare di usarlo con visualizzazioni sui dati di Unity Catalog, perché non valuta l'appartenenza a gruppi a livello di account.

Azure Databricks consiglia di non concedere agli utenti la possibilità di leggere le tabelle e le viste a cui si fa riferimento nella vista.

Gli esempi seguenti illustrano come creare visualizzazioni dinamiche in Unity Catalog.

Autorizzazioni a livello di colonna

Con una visualizzazione dinamica, è possibile limitare le colonne a cui un utente o un gruppo specifico può accedere. Nell'esempio seguente solo i membri del auditors gruppo possono accedere agli indirizzi di posta elettronica dalla sales_raw tabella. Durante l'analisi delle query, Apache Spark sostituisce l'istruzione CASE con la stringa REDACTED letterale o il contenuto effettivo della colonna dell'indirizzo di posta elettronica. Le altre colonne vengono restituite normalmente. Questa strategia non ha alcun impatto negativo sulle prestazioni delle query.

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

Autorizzazioni a livello di riga

Con una visualizzazione dinamica, è possibile specificare le autorizzazioni fino al livello di riga o di campo. Nell'esempio seguente solo i membri del managers gruppo possono visualizzare gli importi delle transazioni quando superano $1.000.000. I risultati corrispondenti vengono filtrati per gli altri utenti.

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

Maschera dati

Poiché le viste nel catalogo unity usano Spark SQL, è possibile implementare la maschera dati avanzata usando espressioni SQL e espressioni regolari più complesse. Nell'esempio seguente tutti gli utenti possono analizzare i domini di posta elettronica, ma solo i membri del auditors gruppo possono visualizzare l'intero indirizzo di posta elettronica di un utente.

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

Eliminare una vista

Per eliminare una visualizzazione, è necessario essere il proprietario della visualizzazione. Per eliminare una vista, eseguire il comando SQL seguente:

DROP VIEW IF EXISTS catalog_name.schema_name.view_name;

Passaggi successivi