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 aUSE SCHEMA
oprávnění nadřazenéhoCREATE 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ámUSE SCHEMA
aCREATE 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ě jakoUSE CATALOG
v katalogu aUSE 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 aUSE 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ů aUSE 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;