Share via


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 ve CREATE TABLE izinlerine sahip USE CATALOG olmanız gerekir. Meta veri deposu yöneticisi veya katalog sahibi size bu ayrıcalıkların tümünü verebilir. Şema sahibi size USE SCHEMA ve CREATE 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ı ve USE 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 ve USE 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 ve USE SCHEMA görünümlerde de SELECT 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ür TRUE . 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ür TRUE . 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;

Sonraki adımlar