Görünüm oluşturma
Bu makalede Unity Kataloğu'nda görünümlerin nasıl oluşturulacağı gösterilmektedir.
Görünüm, bir meta veri deposundaki bir veya daha fazla tablo ve görünümden oluşturulmuş salt okunur bir nesnedir. Unity Kataloğu'nun üç düzeyli ad alanının üçüncü katmanında bulunur. Görünüm, birden çok şema ve katalogdaki tablolardan ve diğer görünümlerden oluşturulabilir.
Dinamik görünümler , veri maskelemenin yanı sıra satır ve sütun düzeyinde erişim denetimi sağlamak için kullanılabilir.
Görünüm oluşturmak için örnek söz dizimi:
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;
Not
Görünümler, Delta tabloları dışındaki veri kaynakları tarafından yedeklenmişse farklı yürütme semantiğine sahip olabilir. Databricks, tablo veya görünüm adı kullanarak veri kaynaklarına başvurarak görünümleri her zaman tanımlamanızı önerir. Bir yol veya URI belirterek veri kümelerine karşı görünümler tanımlamak, veri idaresi gereksinimlerini kafa karıştırıcı hale getirebilir.
Gereksinimler
Görünüm oluşturmak için:
- Üst katalog
USE SCHEMA
üzerinde ve üst şemada veCREATE TABLE
izinlerine sahipUSE CATALOG
olmanız gerekir. Meta veri deposu yöneticisi veya katalog sahibi size bu ayrıcalıkların tümünü verebilir. Şema sahibi sizeUSE SCHEMA
veCREATE TABLE
şema üzerinde ayrıcalıklar verebilir. - Görünümde (
SELECT
tablo veya görünümde,USE CATALOG
katalogda ve şemada) başvuruda bulunarak tabloları veUSE SCHEMA
görünümleri okuyabilmeniz gerekir. - Bir görünüm çalışma alanı-yerel Hive meta veri deposundaki tablolara başvuruyorsa, görünüme yalnızca çalışma alanı yerel tablolarını içeren çalışma alanından erişilebilir. Bu nedenle Databricks, yalnızca Unity Kataloğu meta veri deposundaki tablolardan veya görünümlerden görünüm oluşturmanızı önerir.
- Delta Sharing kullanılarak sizinle paylaşılan bir görünüme başvuran bir görünüm oluşturamazsınız. Bkz . Delta Sharing kullanarak verileri ve yapay zeka varlıklarını güvenli bir şekilde paylaşma.
Görünümü okumak için gereken izinler işlem türüne ve erişim moduna bağlıdır:
- Paylaşılan kümeler ve SQL ambarları için görünümün kendisine,
USE CATALOG
üst kataloğuna veUSE SCHEMA
üst şemasına ihtiyacınız vardırSELECT
. - Tek kullanıcılı kümeler için, üst kataloglarına ve üst şemalarına ek olarak
USE CATALOG
görünümün başvurduğunu tüm tablo veUSE SCHEMA
görünümlerde deSELECT
sahip olmanız gerekir.
Dinamik görünümler oluşturmak veya okumak için:
- Dinamik görünüm gereksinimleri, önceki bölümlerde listelenenlerle aynıdır, ancak dinamik görünüm oluşturmak veya okumak için paylaşılan küme veya SQL ambarı kullanmanız gerekir. Tek kullanıcılı kümeleri kullanamazsınız.
Görünüm oluştur
Görünüm oluşturmak için aşağıdaki SQL komutunu çalıştırın. Köşeli ayraç içindeki öğeler isteğe bağlıdır. Yer tutucu değerlerini değiştirin:
<catalog-name>
: Kataloğun adı.<schema-name>
: Şemanın adı.<view-name>
: Görünümün adı.<query>
: Görünümü oluşturmak için kullanılan sorgu, sütunlar, tablolar ve görünümler.
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>")
Örneğin, tablodaki sales_raw
sütunlardan adlı sales_redacted
bir görünüm oluşturmak için:
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")
Databricks Terraform sağlayıcısını ve databricks_table kullanarak da görünüm oluşturabilirsiniz. databricks_views kullanarak görünüm tam adlarının listesini alabilirsiniz.
Dinamik görünüm oluşturma
Unity Kataloğu'nda, aşağıdakiler dahil olmak üzere ayrıntılı erişim denetimini yapılandırmak için dinamik görünümleri kullanabilirsiniz:
- Sütun veya satır düzeyinde güvenlik.
- Veri maskeleme.
Not
Dinamik görünümleri kullanan ayrıntılı erişim denetimi, Tek Kullanıcıerişim moduna sahip kümelerde kullanılamaz.
Unity Kataloğu, görünümdeki bir satıra, sütuna veya kayda erişebilecek kullanıcıları dinamik olarak sınırlamanıza olanak tanıyan aşağıdaki işlevleri tanıtır:
current_user()
: Geçerli kullanıcının e-posta adresini döndürür.is_account_group_member()
: Geçerli kullanıcı belirli bir hesap düzeyi grubunun üyesiyse döndürürTRUE
. Unity Kataloğu verilerine karşı dinamik görünümlerde kullanılması önerilir.is_member()
: Geçerli kullanıcı belirli bir çalışma alanı düzeyi grubunun üyesiyse döndürürTRUE
. Bu işlev, mevcut Hive meta veri deposuyla uyumluluk için sağlanır. Hesap düzeyinde grup üyeliğini değerlendirmediğinden Unity Kataloğu verilerine karşı görünümlerle kullanmaktan kaçının.
Azure Databricks, kullanıcılara görünümde başvuruda bulunan tabloları ve görünümleri okuma izni vermenizi önerir.
Aşağıdaki örneklerde Unity Kataloğu'nda dinamik görünümlerin nasıl oluşturulacağı gösterilmektedir.
Sütun düzeyinde izinler
Dinamik görünümle, belirli bir kullanıcının veya grubun erişebileceği sütunları sınırlayabilirsiniz. Aşağıdaki örnekte, yalnızca grubun üyeleri tablodan auditors
e-posta adreslerine sales_raw
erişebilir. Sorgu analizi sırasında Apache Spark deyimini CASE
değişmez dizeyle REDACTED
veya e-posta adresi sütununun gerçek içeriğiyle değiştirir. Diğer sütunlar normal şekilde döndürülür. Bu stratejinin sorgu performansı üzerinde olumsuz bir etkisi yoktur.
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")
Satır düzeyi izinleri
Dinamik görünümle, satır veya alan düzeyine kadar izinleri belirtebilirsiniz. Aşağıdaki örnekte, yalnızca grubun üyeleri managers
1.000.000 TL'yi aştıklarında işlem tutarlarını görüntüleyebilir. Eşleşen sonuçlar diğer kullanıcılar için filtrelenir.
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")
Veri maskeleme
Unity Kataloğu'ndaki görünümler Spark SQL kullandığından, daha karmaşık SQL ifadeleri ve normal ifadeler kullanarak gelişmiş veri maskeleme uygulayabilirsiniz. Aşağıdaki örnekte, tüm kullanıcılar e-posta etki alanlarını analiz edebilir, ancak yalnızca grubun üyeleri auditors
kullanıcının e-posta adresinin tamamını görüntüleyebilir.
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")
Görünümü bırakma
Görünümü bırakmak için görünümün sahibi olmanız gerekir. Görünümü bırakmak için aşağıdaki SQL komutunu çalıştırın:
DROP VIEW IF EXISTS catalog_name.schema_name.view_name;