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 aUSE SCHEMA
szülőséma engedélyévelCREATE TABLE
. A metaadattár rendszergazdája vagy a katalógus tulajdonosa mindezeket a jogosultságokat megadhatja. A séma tulajdonosa adhat ÖnnekUSE SCHEMA
ésCREATE TABLE
jogosultságokat a sémához. - A nézetben (
SELECT
a táblázatban vagy nézetben, valamintUSE CATALOG
a katalógusban és a sémában) hivatkozott táblákat ésUSE 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 ésUSE 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 ésUSE 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 adjaTRUE
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 adjaTRUE
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 auditors
sales_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;