Criar visualizações

Este artigo mostra como criar view no Unity Catalog.

Uma view é um objeto somente leitura composto por uma ou mais tabelas e view em um metastore. Ele reside na terceira camada do namespace de três níveis do Unity Catalog. Uma view pode ser criada a partir de tabelas e outras view 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 uma view:

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;

Observação

view pode ter semântica de execução diferente se for apoiada por fontes de dados diferentes de tabelas Delta. A Databricks recomenda que você sempre defina view referenciando a fonte de dados usando uma tabela ou nome view . Definir view em relação dataset especificando um caminho ou URI pode levar a requisitos confusos de governança de dados.

Requisitos

Para criar um view:

  • Você deve ter a permissão USE CATALOG no catálogo pai e as permissões USE SCHEMA e CREATE TABLE no esquema pai. Um administrador de metastore ou o proprietário do catálogo pode conceder a você todos esses privilégios. Um proprietário de esquema pode conceder a você os privilégios USE SCHEMA e CREATE TABLE no esquema.

  • O senhor deve ser capaz de ler as tabelas e exibições referenciadas no site view (SELECT na tabela ou view, bem como USE CATALOG no catálogo e USE SCHEMA no esquema).

  • Se uma view fizer referência a tabelas no Hive metastoredo workspace -local, a view poderá ser acessada somente a partir do workspace que contém as tabelas workspace-local. Por esse motivo, o Databricks recomenda a criação de view apenas de tabelas ou view que estão no metastore do Unity Catalog .

  • O senhor não pode criar um view que faça referência a um view que tenha sido compartilhado com o senhor usando o Delta Sharing. Veja Compartilhar dados e IA ativo com segurança usando o Delta Sharing.

Para ler um view, as permissões necessárias dependem do tipo de compute e do modo de acesso:

  • Para clusters e armazém SQL compartilhados, o senhor precisa de SELECT no próprio view, USE CATALOG em seu catálogo pai e USE SCHEMA em seu esquema pai.

  • Para clusters de usuário único, o senhor também deve ter SELECT em todas as tabelas e visualizações que o view referencia, além de USE CATALOG em seus catálogos pai e USE SCHEMA em seus esquemas pai.

Para criar ou ler a exibição dinâmica:

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

Criar uma visualização

Para criar uma view, execute o seguinte comando SQL. Os itens entre colchetes 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 view.

  • <query>: a query, as colunas e as tabelas e view usadas para compor a view.

CREATE VIEW <catalog-name>.<schema-name>.<view-name> AS
SELECT <query>;
spark.sql("CREATE VIEW <catalog-name>.<schema-name>.<view-name> AS "
  "SELECT <query>")
library(SparkR)

sql(paste("CREATE VIEW <catalog-name>.<schema-name>.<view-name> AS ",
  "SELECT <query>",
  sep = ""))
spark.sql("CREATE VIEW <catalog-name>.<schema-name>.<view-name> AS " +
  "SELECT <query>")

Por exemplo, para criar uma view chamada sales_redacted de colunas na tabela sales_raw:

CREATE VIEW sales_metastore.sales.sales_redacted AS
SELECT
  user_id,
  email,
  country,
  product,
  total
FROM sales_metastore.sales.sales_raw;
spark.sql("CREATE VIEW sales_metastore.sales.sales_redacted AS "
  "SELECT "
  "  user_id, "
  "  email, "
  "  country, "
  "  product, "
  "  total "
  "FROM sales_metastore.sales.sales_raw")
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 = ""))
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 view usando o provedor Databricks Terraform e databricks_table. Você pode recuperar uma lista de nomes completos de exibição usando databricks_views.

Criar uma exibição dinâmica

No Unity Catalog, você pode usar view dinâmica para configurar o controle de acesso refinado, incluindo:

  • Segurança ao nível das colunas ou linhas.

  • mascaramento de dados.

Observação

O controle de acesso refinado usando dinâmica view não está disponível em clusters com 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 view:

  • current_user(): Retorna o endereço email do usuário atual.

  • is_account_group_member(): Retorna TRUE se o usuário atual for membro de um grupo de nível de accountespecífico. Recomendado para uso em view dinâmica em relação aos dados Unity Catalog .

  • is_member(): Retorna TRUE se o usuário atual for membro de um grupo de nível de workspaceespecífico. Esta função é fornecida para compatibilidade com o Hive metastore existente. Evite usá-lo com view nos dados Unity Catalog , porque ele não avalia a associação de grupo no nível account .

Databricks recomenda que você não conceda aos usuários a capacidade de ler as tabelas e view referenciada na view.

Os exemplos a seguir ilustram como criar view dinâmica no Unity Catalog.

Permissões em nível de coluna

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

-- 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
# 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")
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 = ""))
// 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 em nível de linha

Com uma view dinâmica, você pode especificar permissões até o nível de linha ou campo. No exemplo a seguir, apenas os membros do grupo managers podem view os valores das transações quando excedem US$ 1.000.000. Os resultados correspondentes são filtrados para outros usuários.

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

mascaramento de dados

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

-- 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
# 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")
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 = ""))
// 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")

Solte uma visualização

Você deve ser o proprietário da viewpara descartar uma view. Para remover uma view, execute o seguinte comando SQL:

DROP VIEW IF EXISTS catalog_name.schema_name.view_name;