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 leUSE SCHEMA
autorizzazioni eCREATE TABLE
per lo schema padre. Un amministratore del metastore o il proprietario del catalogo può concedere tutti questi privilegi. Un proprietario dello schema può concedereUSE SCHEMA
l'utente eCREATE 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 eUSE 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 eUSE 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 aiUSE CATALOG
cataloghi padre eUSE 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()
: restituisceTRUE
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()
: restituisceTRUE
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;