Share via


Criar vistas

Este artigo mostra como criar exibições no Unity Catalog.

Um modo de exibição é um objeto somente leitura composto de uma ou mais tabelas e exibições em um metastore. Ele reside na terceira camada do namespace de três níveis do Unity Catalog. Uma exibição pode ser criada a partir de tabelas e outras exibições em vários esquemas e catálogos.

As exibições dinâmicas podem ser usadas para fornecer controle de acesso em nível de linha e coluna, além de mascaramento de dados.

Exemplo de sintaxe para criar um modo de exibição:

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;

Nota

As exibições podem ter semânticas de execução diferentes se forem apoiadas por fontes de dados diferentes de tabelas Delta. O Databricks recomenda que você sempre defina modos de exibição fazendo referência a fontes de dados usando um nome de tabela ou exibição. Definir exibições em relação a conjuntos de dados especificando um caminho ou URI pode levar a requisitos confusos de governança de dados.

Requisitos

Para criar uma vista:

  • Você deve ter a USE CATALOG permissão no catálogo pai e as USE SCHEMA permissões e CREATE TABLE no esquema pai. Um administrador de metastore ou o proprietário do catálogo pode conceder todos esses privilégios. Um proprietário de esquema pode conceder-lhe USE SCHEMA privilégios no CREATE TABLE esquema.
  • Você deve ser capaz de ler as tabelas e exibições referenciadas na exibição (SELECT na tabela ou exibição, bem como USE CATALOG no catálogo e USE SCHEMA no esquema).
  • Se um modo de exibição fizer referência a tabelas no metastore do Hive local do espaço de trabalho, o modo de exibição poderá ser acessado somente do espaço de trabalho que contém as tabelas locais do espaço de trabalho. Por esse motivo, o Databricks recomenda a criação de exibições somente a partir de tabelas ou exibições que estão no metastore do Unity Catalog.
  • Não é possível criar um modo de exibição que faça referência a um modo de exibição que foi compartilhado com você usando o Compartilhamento Delta. Consulte Compartilhar dados e ativos de IA com segurança usando o Delta Sharing.

Para ler uma exibição, as permissões necessárias dependem do tipo de computação e do modo de acesso:

  • Para clusters compartilhados e armazéns SQL, você precisa SELECT da própria exibição, USE CATALOG do catálogo pai e USE SCHEMA do esquema pai.
  • Para clusters de usuário único, você também deve ter SELECT em todas as tabelas e exibições às quais o modo de exibição faz referência, além de USE CATALOG seus catálogos pai e USE SCHEMA em seus esquemas pai.

Para criar ou ler vistas dinâmicas:

  • Os requisitos para exibições dinâmicas são os mesmos listados nas seções anteriores, exceto que você deve usar um cluster compartilhado ou um SQL warehouse para criar ou ler uma exibição dinâmica. Não é possível usar clusters de usuário único.

Criar uma vista

Para criar um modo de exibição, execute o seguinte comando SQL. Os itens entre parênteses são opcionais. Substitua os valores de espaço reservado:

  • <catalog-name>: O nome do catálogo.
  • <schema-name>: O nome do esquema.
  • <view-name>: Um nome para a vista.
  • <query>: A consulta, as colunas, as tabelas e os modos de exibição usados para compor o modo de exibição.

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

Por exemplo, para criar um modo de exibição nomeado sales_redacted a partir de colunas na sales_raw tabela:

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

Você também pode criar uma exibição usando o provedor Databricks Terraform e databricks_table. Você pode recuperar uma lista de nomes completos de exibição usando databricks_views.

Criar uma vista dinâmica

No Unity Catalog, você pode usar exibições dinâmicas para configurar o controle de acesso refinado, incluindo:

  • Segurança ao nível de colunas ou linhas.
  • Mascaramento de dados.

Nota

O controle de acesso refinado usando exibições dinâmicas não está disponível em clusters com o modo de acesso de usuárioúnico.

O Unity Catalog apresenta as seguintes funções, que permitem limitar dinamicamente quais usuários podem acessar uma linha, coluna ou registro em uma exibição:

  • current_user(): Retorna o endereço de e-mail do usuário atual.
  • is_account_group_member(): Retorna TRUE se o usuário atual for membro de um grupo específico no nível da conta. Recomendado para uso em exibições dinâmicas em relação aos dados do Catálogo Unity.
  • is_member(): Retorna TRUE se o usuário atual for membro de um grupo específico no nível do espaço de trabalho. Esta função é fornecida para compatibilidade com o metastore Hive existente. Evite usá-lo com visualizações em relação aos dados do Catálogo Unity, porque ele não avalia a associação ao grupo no nível da conta.

O Azure Databricks recomenda que você não conceda aos usuários a capacidade de ler as tabelas e exibições referenciadas no modo de exibição.

Os exemplos a seguir ilustram como criar exibições dinâmicas no Unity Catalog.

Permissões no nível da coluna

Com uma exibição dinâmica, você pode limitar as colunas que um usuário ou grupo específico pode acessar. No exemplo a seguir, somente os membros do auditors grupo podem acessar endereços de e-mail da sales_raw tabela. Durante a análise da consulta, o Apache Spark substitui a CASE instrução pela cadeia de caracteres REDACTED literal ou pelo conteúdo real da coluna de endereço de e-mail. Outras colunas são retornadas normalmente. Essa estratégia não tem impacto negativo no desempenho da consulta.

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

Permissões de nível de linha

Com uma vista dinâmica, pode especificar permissões até ao nível da linha ou do campo. No exemplo a seguir, somente os membros do grupo podem visualizar os managers valores das transações quando elas excederem US$ 1.000.000. Os resultados correspondentes são filtrados para outros usuários.

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

Máscara de dados

Como as exibições no Unity Catalog usam o Spark SQL, você pode implementar o mascaramento avançado de dados usando expressões SQL e expressões regulares mais complexas. No exemplo a seguir, todos os usuários podem analisar domínios de email, mas apenas os membros do grupo podem exibir todo o auditors endereço de e-mail de um usuário.

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

Soltar uma vista

Tem de ser o proprietário da vista para largar uma vista. Para soltar um modo de exibição, execute o seguinte comando SQL:

DROP VIEW IF EXISTS catalog_name.schema_name.view_name;

Próximos passos