Share via


Nézetek létrehozása

Ez a cikk bemutatja, hogyan hozhat létre nézeteket a Unity Catalogban.

A nézet egy metaadattár egy vagy több táblájából és nézetéből álló írásvédett objektum. A Unity Catalog háromszintű névterének harmadik rétegében található. Több sémában és katalógusban lévő táblákból és más nézetekből is létrehozhat nézetet.

A dinamikus nézetek az adatmaszkolás mellett sor- és oszlopszintű hozzáférés-vezérlést is biztosítanak.

Példa szintaxis nézet létrehozásához:

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;

Feljegyzés

A nézetek eltérő végrehajtási szemantikával rendelkezhetnek, ha a Delta-tábláktól eltérő adatforrások is alátámasztják őket. A Databricks azt javasolja, hogy mindig adjon meg nézeteket úgy, hogy adatforrásokra hivatkozik egy tábla vagy nézetnév használatával. Az adathalmazok nézeteinek elérési út vagy URI megadásával történő meghatározása zavaró adatszabályozási követelményekhez vezethet.

Követelmények

Nézet létrehozása:

  • Rendelkeznie kell a USE CATALOG szülőkatalógus engedélyével, valamint a USE SCHEMA szülőséma engedélyével CREATE TABLE . A metaadattár rendszergazdája vagy a katalógus tulajdonosa mindezeket a jogosultságokat megadhatja. A séma tulajdonosa adhat Önnek USE SCHEMA és CREATE TABLE jogosultságokat a sémához.
  • A nézetben (SELECT a táblázatban vagy nézetben, valamint USE CATALOG a katalógusban és a sémában) hivatkozott táblákat és USE SCHEMA nézeteket el kell tudni olvasnia.
  • Ha egy nézet a munkaterület-helyi Hive metaadattár tábláira hivatkozik, a nézet csak a munkaterület-helyi táblákat tartalmazó munkaterületről érhető el. Ezért a Databricks azt javasolja, hogy csak a Unity Catalog metaadattárában található táblákból vagy nézetekből hozzon létre nézeteket.
  • Nem hozhat létre olyan nézetet, amely a Delta Sharing használatával megosztott nézetre hivatkozik. Lásd: Adatok és AI-eszközök biztonságos megosztása a Delta Sharing használatával.

A nézetek olvasásához a szükséges engedélyek a számítási típustól és a hozzáférési módtól függenek:

  • Megosztott fürtök és SQL-tárolók esetében magának a nézetnek, USE CATALOG a szülőkatalógusnak és USE SCHEMA a szülőséma alapján kell elvégeznieSELECT.
  • Egyfelhasználós fürtök esetén az összes olyan táblán és nézeten is rendelkeznie SELECT kell, amelyekre a nézet hivatkozik, a szülőkatalógusokon és USE SCHEMA a szülősémaikon kívülUSE CATALOG.

Dinamikus nézetek létrehozása vagy olvasása:

  • A dinamikus nézetekre vonatkozó követelmények megegyeznek az előző szakaszokban felsoroltakkal, azzal a kivételrel, hogy egy dinamikus nézet létrehozásához vagy olvasásához megosztott fürtöt vagy SQL Warehouse-t kell használnia. Nem használhat egyfelhasználós fürtöket.

Nézet létrehozása

Nézet létrehozásához futtassa a következő SQL-parancsot. A szögletes zárójelek nem kötelezőek. Cserélje le a helyőrző értékeket:

  • <catalog-name>: A katalógus neve.
  • <schema-name>: A séma neve.
  • <view-name>: A nézet neve.
  • <query>: A nézet létrehozásához használt lekérdezés, oszlopok, táblák és nézetek.

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

Például a tábla oszlopaiból sales_raw elnevezett sales_redacted nézet létrehozása:

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

Nézetet a Databricks Terraform szolgáltatóval és databricks_table is létrehozhat. Az databricks_views használatával lekérheti a teljes nézetnevek listáját.

Dinamikus nézet létrehozása

A Unity Catalogban dinamikus nézetekkel konfigurálhatja a részletes hozzáférés-vezérlést, beleértve a következőket:

  • Biztonság oszlopok vagy sorok szintjén.
  • Adatmaszkolás.

Feljegyzés

A dinamikus nézeteket használó részletes hozzáférés-vezérlés nem érhető el az egyfelhasználóshozzáférési móddal rendelkező fürtökön.

A Unity Catalog a következő függvényeket mutatja be, amelyekkel dinamikusan korlátozhatja, hogy mely felhasználók férhetnek hozzá egy sorhoz, oszlophoz vagy rekordhoz egy nézetben:

  • current_user(): Az aktuális felhasználó e-mail-címét adja vissza.
  • is_account_group_member(): Akkor adja TRUE vissza, ha az aktuális felhasználó egy adott fiókszintű csoport tagja. Dinamikus nézetekben való használatra ajánlott a Unity Catalog adataival szemben.
  • is_member(): Akkor adja TRUE vissza, ha az aktuális felhasználó egy adott munkaterületszintű csoport tagja. Ez a függvény a meglévő Hive metaadattárral való kompatibilitás érdekében érhető el. Ne használja a Unity Catalog-adatok nézeteivel, mert nem értékeli ki a fiókszintű csoporttagságokat.

Az Azure Databricks azt javasolja, hogy ne engedélyezze a felhasználóknak a nézetben hivatkozott táblák és nézetek olvasását.

Az alábbi példák bemutatják, hogyan hozhat létre dinamikus nézeteket a Unity Catalogban.

Oszlopszintű engedélyek

Dinamikus nézetben korlátozhatja azokat az oszlopokat, amelyekhez egy adott felhasználó vagy csoport hozzáférhet. Az alábbi példában csak a csoport tagjai férhetnek hozzá a auditorssales_raw táblából származó e-mail-címekhez. A lekérdezéselemzés során az Apache Spark az CASE utasítást a literális sztringre REDACTED vagy az e-mail-cím oszlop tényleges tartalmára cseréli. A többi oszlop a szokásos módon lesz visszaadva. Ez a stratégia nem befolyásolja negatívan a lekérdezés teljesítményét.

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

Sorszintű engedélyek

Dinamikus nézettel a sor- vagy mezőszintig megadhatja az engedélyeket. Az alábbi példában csak a csoport tagjai tekinthetik meg az managers 1 000 000 USD-t meghaladó tranzakcióösszegeket. Az egyező eredmények szűrése más felhasználók számára történik.

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

Adatmaszkolás

Mivel a Unity Catalog nézetei Spark SQL-t használnak, összetettebb SQL-kifejezések és reguláris kifejezések használatával speciális adatmaszkolást valósíthat meg. Az alábbi példában minden felhasználó elemezheti az e-mail-tartományokat, de csak a csoport tagjai tekinthetik meg a auditors felhasználó teljes e-mail-címét.

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

Nézet elvetése

A nézet elvetéséhez a nézet tulajdonosának kell lennie. Nézet elvetéséhez futtassa a következő SQL-parancsot:

DROP VIEW IF EXISTS catalog_name.schema_name.view_name;

Következő lépések