Share via


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örigheterna USE SCHEMA och CREATE TABLE för det överordnade schemat. En metaarkivadministratör eller katalogägaren kan ge dig alla dessa privilegier. En schemaägare kan ge dig USE SCHEMA och CREATE TABLE behörigheter för schemat.
  • Du måste kunna läsa tabellerna och vyerna som refereras i vyn (SELECT i tabellen eller vyn, samt USE CATALOG i katalogen och USE 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 och USE 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 till USE CATALOG , förutom i deras överordnade kataloger och USE 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(): Returnerar TRUE 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(): Returnerar TRUE 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;

Nästa steg