Skapa vyer
Den här artikeln visar hur du skapar vyer i Unity Catalog.
En vy är ett skrivskyddat objekt som består av en eller flera tabeller och vyer i ett metaarkiv. Den finns i det tredje lagret i Unity Catalogs namnområde på tre nivåer. En vy kan skapas från tabeller och andra vyer i flera scheman och kataloger.
Dynamiska vyer kan användas för att tillhandahålla åtkomstkontroll på rad- och kolumnnivå, utöver datamaskering.
Exempelsyntax för att skapa en vy:
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;
Kommentar
Vyer kan ha olika körningssemantik om de backas upp av andra datakällor än Delta-tabeller. Databricks rekommenderar att du alltid definierar vyer genom att referera till datakällor med hjälp av en tabell eller ett visningsnamn. Att definiera vyer mot datauppsättningar genom att ange en sökväg eller URI kan leda till förvirrande krav för datastyrning.
Krav
Så här skapar du en vy:
- Du måste ha behörigheten
USE CATALOG
för den överordnade katalogen och behörigheternaUSE SCHEMA
ochCREATE TABLE
för det överordnade schemat. En metaarkivadministratör eller katalogägaren kan ge dig alla dessa privilegier. En schemaägare kan ge digUSE SCHEMA
ochCREATE TABLE
behörigheter för schemat. - Du måste kunna läsa tabellerna och vyerna som refereras i vyn (
SELECT
i tabellen eller vyn, samtUSE CATALOG
i katalogen ochUSE SCHEMA
i schemat). - Om en vy refererar till tabeller i det arbetsytelokala Hive-metaarkivet kan vyn endast nås från arbetsytan som innehåller de arbetsytelokala tabellerna. Därför rekommenderar Databricks att du endast skapar vyer från tabeller eller vyer som finns i Unity Catalog-metaarkivet.
- Du kan inte skapa en vy som refererar till en vy som har delats med dig med deltadelning. Se Dela data och AI-tillgångar på ett säkert sätt med deltadelning.
Om du vill läsa en vy beror de behörigheter som krävs på beräkningstypen och åtkomstläget:
- För delade kluster och SQL-lager behöver
SELECT
du i själva vyn,USE CATALOG
i den överordnade katalogen ochUSE SCHEMA
på dess överordnade schema. - För kluster med en användare måste du också ha
SELECT
på alla tabeller och vyer som vyn refererar tillUSE CATALOG
, förutom i deras överordnade kataloger ochUSE SCHEMA
i deras överordnade scheman.
Så här skapar eller läser du dynamiska vyer:
- Kraven för dynamiska vyer är desamma som de som anges i föregående avsnitt, förutom att du måste använda ett delat kluster eller SQL-lager för att skapa eller läsa en dynamisk vy. Du kan inte använda kluster med en användare.
Skapa en vy
Kör följande SQL-kommando för att skapa en vy. Objekt inom hakparenteser är valfria. Ersätt platshållarvärdena:
<catalog-name>
: Namnet på katalogen.<schema-name>
: Namnet på schemat.<view-name>
: Ett namn på vyn.<query>
: Frågan, kolumnerna och tabellerna och vyerna som används för att skapa vyn.
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>")
Om du till exempel vill skapa en vy med namnet sales_redacted
från kolumner i sales_raw
tabellen:
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")
Du kan också skapa en vy med hjälp av Databricks Terraform-providern och databricks_table. Du kan hämta en lista över fullständiga namn med hjälp av databricks_views.
Skapa en dynamisk vy
I Unity Catalog kan du använda dynamiska vyer för att konfigurera detaljerad åtkomstkontroll, inklusive:
- Säkerhet på kolumn- eller radnivå.
- Datamaskering.
Kommentar
Detaljerad åtkomstkontroll med dynamiska vyer är inte tillgängligt i kluster med åtkomstläge för en användare.
Unity Catalog introducerar följande funktioner som gör att du dynamiskt kan begränsa vilka användare som kan komma åt en rad, kolumn eller post i en vy:
current_user()
: Returnerar den aktuella användarens e-postadress.is_account_group_member()
: ReturnerarTRUE
om den aktuella användaren är medlem i en specifik grupp på kontonivå. Rekommenderas för användning i dynamiska vyer mot Unity Catalog-data.is_member()
: ReturnerarTRUE
om den aktuella användaren är medlem i en specifik grupp på arbetsytenivå. Den här funktionen tillhandahålls för kompatibilitet med det befintliga Hive-metaarkivet. Undvik att använda den med vyer mot Unity Catalog-data eftersom den inte utvärderar gruppmedlemskap på kontonivå.
Azure Databricks rekommenderar att du inte ger användarna möjlighet att läsa tabeller och vyer som refereras i vyn.
Följande exempel visar hur du skapar dynamiska vyer i Unity Catalog.
Behörigheter på kolumnnivå
Med en dynamisk vy kan du begränsa vilka kolumner en specifik användare eller grupp kan komma åt. I följande exempel kan endast medlemmar i auditors
gruppen komma åt e-postadresser från sales_raw
tabellen. Under frågeanalysen ersätter Apache Spark -instruktionen CASE
med antingen literalsträngen REDACTED
eller det faktiska innehållet i e-postadresskolumnen. Andra kolumner returneras som vanligt. Den här strategin har ingen negativ inverkan på frågeprestandan.
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")
Behörigheter på radnivå
Med en dynamisk vy kan du ange behörigheter ned till rad- eller fältnivå. I följande exempel kan endast medlemmar i managers
gruppen visa transaktionsbelopp när de överstiger 1 000 000 USD. Matchande resultat filtreras bort för andra användare.
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")
Datamaskning
Eftersom vyer i Unity Catalog använder Spark SQL kan du implementera avancerad datamaskning med hjälp av mer komplexa SQL-uttryck och reguljära uttryck. I följande exempel kan alla användare analysera e-postdomäner, men endast medlemmar i auditors
gruppen kan visa en användares hela e-postadress.
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")
Ta bort en vy
Du måste vara vyns ägare för att kunna släppa en vy. Om du vill släppa en vy kör du följande SQL-kommando:
DROP VIEW IF EXISTS catalog_name.schema_name.view_name;