Vytvoření zobrazení

Tento článek ukazuje, jak vytvořit zobrazení v katalogu Unity.

Zobrazení je objekt jen pro čtení složený z jedné nebo více tabulek a zobrazení v metastoru. Nachází se ve třetí vrstvě tříúrovňového oboru názvů katalogu Unity. Zobrazení lze vytvořit z tabulek a dalších zobrazení ve více schématech a katalogech.

Dynamická zobrazení se dají použít k zajištění řízení přístupu na úrovni řádků a sloupců kromě maskování dat.

Příklad syntaxe pro vytvoření zobrazení:

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;

Poznámka:

Zobrazení můžou mít jinou sémantiku spouštění, pokud jsou zálohovaná jinými zdroji dat než tabulkami Delta. Databricks doporučuje vždy definovat zobrazení odkazováním na zdroje dat pomocí názvu tabulky nebo zobrazení. Definování zobrazení pro datové sady zadáním cesty nebo identifikátoru URI může vést k matoucím požadavkům zásad správného řízení dat.

Požadavky

Vytvoření zobrazení:

  • Musíte mít USE CATALOG oprávnění pro nadřazený katalog a USE SCHEMA oprávnění nadřazeného CREATE TABLE schématu. Správce metastoru nebo vlastník katalogu vám může udělit všechna tato oprávnění. Vlastník schématu vám USE SCHEMA a CREATE TABLE oprávněním k schématu může udělit.
  • Musíte být schopni číst tabulky a zobrazení odkazované v zobrazení (SELECT v tabulce nebo zobrazení, stejně jako USE CATALOG v katalogu a USE SCHEMA ve schématu).
  • Pokud zobrazení odkazuje na tabulky v metastore Hive v místním pracovním prostoru, je možné k zobrazení přistupovat pouze z pracovního prostoru, který obsahuje místní tabulky pracovního prostoru. Z tohoto důvodu databricks doporučuje vytvářet zobrazení pouze z tabulek nebo zobrazení, která jsou v metastore katalogu Unity.
  • Pomocí rozdílového sdílení nelze vytvořit zobrazení, které odkazuje na zobrazení, které s vámi někdo sdílí. Informace o bezpečném sdílení dat a prostředků umělé inteligence pomocí rozdílového sdílení

Oprávnění požadovaná ke čtení zobrazení závisí na typu výpočetního výkonu a režimu přístupu:

  • Pro sdílené clustery a sklady SQL potřebujete SELECT zobrazení samotné, USE CATALOG nadřazený katalog a USE SCHEMA nadřazené schéma.
  • U clusterů s jedním uživatelem musíte mít SELECT také všechny tabulky a zobrazení, na které odkazuje zobrazení, kromě USE CATALOG nadřazených katalogů a USE SCHEMA jejich nadřazených schémat.

Vytvoření nebo čtení dynamických zobrazení:

  • Požadavky na dynamická zobrazení jsou stejné jako požadavky uvedené v předchozích částech, s výjimkou toho, že k vytvoření nebo čtení dynamického zobrazení musíte použít sdílený cluster nebo SQL Warehouse. Clustery s jedním uživatelem nelze použít.

Vytvoří zobrazení.

Pokud chcete vytvořit zobrazení, spusťte následující příkaz SQL. Položky v závorkách jsou volitelné. Nahraďte zástupné hodnoty:

  • <catalog-name>: Název katalogu.
  • <schema-name>: Název schématu.
  • <view-name>: Název zobrazení.
  • <query>: Dotaz, sloupce a tabulky a zobrazení použité k vytvoření zobrazení.

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

Pokud například chcete vytvořit zobrazení pojmenované sales_redacted ze sloupců v sales_raw tabulce:

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

Zobrazení můžete vytvořit také pomocí zprostředkovatele Databricks Terraform a databricks_table. Seznam úplných jmen můžete načíst pomocí databricks_views.

Vytvoření dynamického zobrazení

V katalogu Unity můžete pomocí dynamických zobrazení nakonfigurovat jemně odstupňované řízení přístupu, včetně:

  • Zabezpečení na úrovni sloupců nebo řádků
  • Maskování dat

Poznámka:

Podrobné řízení přístupu pomocí dynamických zobrazení není k dispozici v clusterech s režimem přístupu jednoho uživatele.

Katalog Unity zavádí následující funkce, které umožňují dynamicky omezit, kteří uživatelé mají přístup k řádku, sloupci nebo záznamu v zobrazení:

  • current_user(): Vrátí e-mailovou adresu aktuálního uživatele.
  • is_account_group_member(): Vrátí TRUE , pokud je aktuální uživatel členem konkrétní skupiny na úrovni účtu. Doporučeno pro použití v dynamických zobrazeních s daty katalogu Unity.
  • is_member(): Vrátí TRUE , pokud je aktuální uživatel členem konkrétní skupiny na úrovni pracovního prostoru. Tato funkce je k dispozici z důvodu kompatibility se stávajícím metastorem Hive. Nepoužívejte ho se zobrazeními pro data katalogu Unity, protože nevyhodnocuje členství ve skupinách na úrovni účtu.

Azure Databricks doporučuje uživatelům neudělovat možnost číst tabulky a zobrazení odkazovaná v zobrazení.

Následující příklady ukazují, jak vytvořit dynamická zobrazení v katalogu Unity.

Oprávnění na úrovni sloupce

Pomocí dynamického zobrazení můžete omezit sloupce, ke kterým má konkrétní uživatel nebo skupina přístup. V následujícím příkladu mají k e-mailovým adresům z sales_raw tabulky přístup jenom členové auditors skupiny. Během analýzy dotazů Apache Spark nahradí CASE příkaz buď literálovým řetězcem REDACTED , nebo skutečným obsahem sloupce e-mailové adresy. Ostatní sloupce se vrátí jako normální. Tato strategie nemá žádný negativní dopad na výkon dotazů.

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

Oprávnění na úrovni řádků

Pomocí dynamického zobrazení můžete zadat oprávnění na úrovni řádku nebo pole. V následujícím příkladu můžou transakce zobrazit pouze členové managers skupiny, pokud překročí 1 000 000 KČ. Odpovídající výsledky se odfiltrují pro ostatní uživatele.

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

Maskování dat

Vzhledem k tomu, že zobrazení v katalogu Unity používají Spark SQL, můžete implementovat pokročilé maskování dat pomocí složitějších výrazů SQL a regulárních výrazů. V následujícím příkladu můžou všichni uživatelé analyzovat e-mailové domény, ale jenom členové auditors skupiny můžou zobrazit celou e-mailovou adresu uživatele.

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

Přetažení zobrazení

Abyste mohli zobrazení odstranit, musíte být vlastníkem zobrazení. Pokud chcete zobrazení odstranit, spusťte následující příkaz SQL:

DROP VIEW IF EXISTS catalog_name.schema_name.view_name;

Další kroky