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õesUSE SCHEMA
eCREATE 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égiosUSE SCHEMA
eCREATE 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 comoUSE CATALOG
no catálogo eUSE 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 eUSE 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 deUSE CATALOG
em seus catálogos pai eUSE 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()
: RetornaTRUE
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()
: RetornaTRUE
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;