Tworzenie widoków

W tym artykule pokazano, jak tworzyć widoki w wykazie aparatu Unity.

Widok to obiekt tylko do odczytu składający się z co najmniej jednej tabeli i widoków w magazynie metadanych. Znajduje się ona w trzeciej warstwie trzy-poziomowej przestrzeni nazw wykazu aparatu Unity. Widok można utworzyć na podstawie tabel i innych widoków w wielu schematach i katalogach.

Widoki dynamiczne mogą służyć do zapewniania kontroli dostępu na poziomie wiersza i kolumny oprócz maskowania danych.

Przykładowa składnia tworzenia widoku:

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;

Uwaga

Widoki mogą mieć różne semantyka wykonywania, jeśli są one wspierane przez źródła danych inne niż tabele delty. Usługa Databricks zaleca, aby zawsze definiować widoki przez odwoływanie się do źródeł danych przy użyciu nazwy tabeli lub widoku. Definiowanie widoków względem zestawów danych przez określenie ścieżki lub identyfikatora URI może prowadzić do mylących wymagań dotyczących ładu danych.

Wymagania

Aby utworzyć widok:

  • Musisz mieć USE CATALOG uprawnienie do katalogu nadrzędnego i USE SCHEMA uprawnień i CREATE TABLE w schemacie nadrzędnym. Administrator magazynu metadanych lub właściciel wykazu może przyznać Ci wszystkie te uprawnienia. Właściciel schematu może przyznać Ci USE SCHEMA i CREATE TABLE uprawnienia schematu.
  • Musisz mieć możliwość odczytania tabel i widoków, do których odwołuje się widok (SELECT w tabeli lub widoku, a także USE CATALOG w wykazie i USE SCHEMA schemacie).
  • Jeśli widok odwołuje się do tabel w magazynie metadanych Hive obszaru roboczego lokalnego, dostęp do widoku można uzyskać tylko z obszaru roboczego zawierającego tabele lokalne obszaru roboczego. Z tego powodu usługa Databricks zaleca tworzenie widoków tylko z tabel lub widoków, które znajdują się w magazynie metadanych wykazu aparatu Unity.
  • Nie można utworzyć widoku, który odwołuje się do widoku, który został Ci udostępniony przy użyciu funkcji udostępniania różnicowego. Zobacz Bezpieczne udostępnianie danych i zasobów sztucznej inteligencji przy użyciu funkcji udostępniania różnicowego.

Aby odczytać widok, wymagane uprawnienia zależą od typu obliczeniowego i trybu dostępu:

  • W przypadku klastrów udostępnionych i magazynów SQL potrzebny SELECT jest sam widok, USE CATALOG katalog nadrzędny i USE SCHEMA schemat nadrzędny.
  • W przypadku klastrów pojedynczego użytkownika należy również mieć SELECT wszystkie tabele i widoki, do których odwołuje się widok, oprócz USE CATALOG ich katalogów nadrzędnych i USE SCHEMA schematów nadrzędnych.

Aby utworzyć lub odczytać widoki dynamiczne:

  • Wymagania dotyczące widoków dynamicznych są takie same jak te wymienione w poprzednich sekcjach, z tą różnicą, że do tworzenia lub odczytywania widoku dynamicznego należy użyć udostępnionego klastra lub magazynu SQL Warehouse. Nie można używać klastrów z jednym użytkownikiem.

Utwórz widok

Aby utworzyć widok, uruchom następujące polecenie SQL. Elementy w nawiasach kwadratowych są opcjonalne. Zastąp wartości symboli zastępczych:

  • <catalog-name>: nazwa wykazu.
  • <schema-name>: nazwa schematu.
  • <view-name>: nazwa widoku.
  • <query>: zapytanie, kolumny i tabele oraz widoki używane do tworzenia widoku.

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

Aby na przykład utworzyć widok o nazwie sales_redacted z kolumn w sales_raw tabeli:

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

Widok można również utworzyć przy użyciu dostawcy narzędzia Terraform usługi Databricks i databricks_table. Listę pełnych nazw można pobrać przy użyciu databricks_views.

Tworzenie widoku dynamicznego

W wykazie aparatu Unity można użyć widoków dynamicznych do skonfigurowania szczegółowej kontroli dostępu, w tym:

  • Zabezpieczenia na poziomie kolumn lub wierszy.
  • Maskowanie danych.

Uwaga

Szczegółowa kontrola dostępu przy użyciu widoków dynamicznych nie jest dostępna w klastrach z trybem dostępu pojedynczy użytkownik.

Wykaz aparatu Unity wprowadza następujące funkcje, które umożliwiają dynamiczne ograniczanie dostępu użytkowników do wiersza, kolumny lub rekordu w widoku:

  • current_user(): zwraca adres e-mail bieżącego użytkownika.
  • is_account_group_member(): zwraca TRUE wartość, jeśli bieżący użytkownik jest członkiem określonej grupy na poziomie konta. Zalecane do użycia w widokach dynamicznych względem danych wykazu aparatu Unity.
  • is_member(): zwraca TRUE wartość, jeśli bieżący użytkownik jest członkiem określonej grupy na poziomie obszaru roboczego. Ta funkcja jest udostępniana pod kątem zgodności z istniejącym magazynem metadanych Hive. Unikaj używania ich z widokami względem danych wykazu aparatu Unity, ponieważ nie ocenia członkostwa w grupach na poziomie konta.

Usługa Azure Databricks zaleca, aby użytkownicy nie udzielali użytkownikom możliwości odczytywania tabel i widoków, do których odwołuje się widok.

Poniższe przykłady ilustrują sposób tworzenia widoków dynamicznych w wykazie aparatu Unity.

Uprawnienia na poziomie kolumny

W widoku dynamicznym można ograniczyć kolumny, do których może uzyskać dostęp określony użytkownik lub grupa. W poniższym przykładzie tylko członkowie auditors grupy mogą uzyskiwać dostęp do adresów e-mail z sales_raw tabeli. Podczas analizy zapytań platforma Apache Spark zastępuje instrukcję CASE ciągiem REDACTED literału lub rzeczywistą zawartością kolumny adresu e-mail. Inne kolumny są zwracane normalnie. Ta strategia nie ma negatywnego wpływu na wydajność zapytań.

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

Uprawnienia na poziomie wiersza

W widoku dynamicznym można określić uprawnienia na poziomie wiersza lub pola. W poniższym przykładzie tylko członkowie managers grupy mogą wyświetlać kwoty transakcji, gdy przekraczają 1000 000 USD. Pasujące wyniki są filtrowane dla innych użytkowników.

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

Maskowanie danych

Ponieważ widoki w wykazie aparatu Unity używają języka Spark SQL, można zaimplementować zaawansowane maskowanie danych przy użyciu bardziej złożonych wyrażeń SQL i wyrażeń regularnych. W poniższym przykładzie wszyscy użytkownicy mogą analizować domeny poczty e-mail, ale tylko członkowie auditors grupy mogą wyświetlać cały adres e-mail użytkownika.

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

Usuwanie widoku

Aby usunąć widok, musisz być właścicielem widoku. Aby usunąć widok, uruchom następujące polecenie SQL:

DROP VIEW IF EXISTS catalog_name.schema_name.view_name;

Następne kroki