Como criar uma visualização autorizada

O BigQuery é um serviço de armazenamento de dados para análise em escala de petabyte. Ele é usado para executar consultas SQL em grandes volumes de dados, praticamente em tempo real.

A concessão de acesso de visualização a um conjunto de dados também é conhecida como criação de visualização autorizada no BigQuery. Uma visualização autorizada permite que você compartilhe resultados de consultas com usuários e grupos específicos sem conceder a eles acesso às tabelas subjacentes. Também é possível usar a consulta SQL da visualização para restringir as colunas (campos) que os usuários podem consultar. Neste tutorial, você criará uma visualização autorizada.

Objetivos

Objetivos deste tutorial:

  • Criar conjuntos de dados e aplicar controles de acesso a eles.
  • Atribuir controles de acesso ao seu projeto.
  • Criar uma visualização autorizada que restrinja os dados que os usuários podem consultar.

Custos

O BigQuery é um produto pago. O uso dele é feito neste tutorial. O BigQuery oferece alguns recursos gratuitamente até um limite específico. Para mais informações, consulte Operações gratuitas e nível gratuito do BigQuery.

Antes de começar

Antes de começar este tutorial, use o Console do Google Cloud para criar ou selecionar um projeto.

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No Console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. O BigQuery é ativado automaticamente em novos projetos. Para ativar o BigQuery em um projeto preexistente, acesse Ative a API BigQuery.

    Ative a API

  4. Se você não quiser informar um cartão de crédito ou ativar o faturamento do seu projeto, o BigQuery fornece um sandbox. É possível seguir as etapas deste tópico mesmo que seu projeto não tenha o faturamento ativado. Se quiser ativá-lo, consulte Saiba como ativar o faturamento.

Introdução

Neste tutorial, você criará dois conjuntos de dados: um para seus dados de origem e outro para sua visualização autorizada. O conjunto de dados de origem será alimentado pelo conjunto de dados público do GitHub. Em seguida, você criará uma visualização que consulta uma tabela no conjunto de dados de origem.

Depois de criar os conjuntos de dados e a visualização, atribua controles de acesso ao projeto, ao conjunto de dados que contém a visualização e ao conjunto de dados que contém os dados de origem.

A concessão de acesso de visualização a um conjunto de dados de origem também é conhecida como criação de visualização autorizada. Ao criar uma visualização autorizada, siga estes passos:

  • Criar um conjunto de dados separado para armazenar a visualização
  • Criar a visualização no novo conjunto de dados
  • Atribuir controles de acesso ao projeto
  • Atribuir controles de acesso ao conjunto de dados que contém a visualização
  • Autorizar a visualização a acessar o conjunto de dados de origem

Criar um conjunto de dados de origem

Comece criando um conjunto de dados para armazenar os dados de origem. Neste tutorial, você preencherá uma tabela no conjunto de dados de origem consultando o conjunto de dados público do GitHub. Os dados contidos no conjunto mostram informações que não devem ser visualizadas pelos seus analistas. Você restringe o acesso aos dados usando uma visualização autorizada.

Para criar um conjunto de dados de origem:

Console

  1. No Console do Cloud, abra a página do BigQuery.

    Ir para o BigQuery

  2. No painel Explorador, selecione o projeto em que você quer criar o conjunto de dados.

  3. No painel de detalhes, clique em Criar conjunto de dados.

  4. Em ID do conjunto de dados, digite github_source_data.

  5. Mantenha todas as outras configurações padrão e clique em Criar conjunto de dados.

Java

Antes de testar essa amostra, siga as instruções de configuração para Java no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Java.

// Create a source dataset to store your table.
Dataset sourceDataset = bigquery.create(DatasetInfo.of(sourceDatasetId));

Python

Antes de testar essa amostra, siga as instruções de configuração para Python no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Python.

from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = "github_source_data"
source_dataset_id_full = "{}.{}".format(client.project, source_dataset_id)

source_dataset = bigquery.Dataset(source_dataset_id_full)
# Specify the geographic location where the dataset should reside.
source_dataset.location = "US"
source_dataset = client.create_dataset(source_dataset)  # API request

Depois de criar o conjunto de dados de origem, preencha uma tabela nele usando uma consulta SQL. Ela recupera dados do conjunto de dados públicos do GitHub.

Console

  1. No Console do Cloud, abra a página do BigQuery.

    Ir para o BigQuery

  2. Clique em Escrever nova consulta.

  3. Copie e cole a consulta a seguir na área de texto do Editor de consultas.

    SELECT
      commit,
      author,
      committer,
      repo_name
    FROM
      `bigquery-public-data.github_repos.commits`
    LIMIT
      1000
    
  4. Clique em Mais e selecione Configurações de consulta.

  5. Em Destino, marque a caixa em Definir uma tabela de destino para os resultados da consulta.

    • Em Nome do projeto, verifique se o projeto está selecionado.
    • Em Nome do conjunto de dados, verifique se github_source_data está selecionado.
    • Em Nome da tabela, digite: github_contributors.
    • Clique em Salvar.

  6. Clique em Executar.

  7. Quando a consulta for concluída, clique em github_contributors e em Visualizar para confirmar se os dados foram gravados na tabela.

Java

Antes de testar essa amostra, siga as instruções de configuração para Java no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Java.

// Populate a source table
String tableQuery =
    "SELECT commit, author, committer, repo_name"
        + " FROM `bigquery-public-data.github_repos.commits`"
        + " LIMIT 1000";
QueryJobConfiguration queryConfig =
    QueryJobConfiguration.newBuilder(tableQuery)
        .setDestinationTable(TableId.of(sourceDatasetId, sourceTableId))
        .build();
bigquery.query(queryConfig);

Python

Antes de testar essa amostra, siga as instruções de configuração para Python no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Python.

source_table_id = "github_contributors"
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location="US",
    job_config=job_config,
)  # API request - starts the query

query_job.result()  # Waits for the query to finish

Criar um conjunto de dados separado para armazenar sua visualização

Depois de criar seu conjunto de dados de origem, você criará um conjunto de dados novo e separado para armazenar a visualização autorizada que você compartilhará com seus analistas de dados. Em uma etapa posterior, você concederá a visualização autorizada acesso aos dados no conjunto de dados de origem. Os analistas de dados terão acesso à visualização autorizada, mas não aos acessos diretos aos dados de origem.

As visualizações autorizadas que são controladas no nível do conjunto de dados precisam ser criadas em um conjunto de dados diferente dos dados de origem, para que os proprietários de dados possam conceder aos usuários acesso à visualização autorizada sem conceder simultaneamente acesso ao objeto subjacente para a área de transferência do sistema. O conjunto de dados de dados de origem e o conjunto de dados de visualização autorizados precisam estar no mesmo local regional.

Para criar um conjunto de dados e armazenar sua visualização:

Console

  1. No Console do Cloud, abra a página do BigQuery.

    Ir para o BigQuery

  2. No painel Explorador, selecione o projeto em que você quer criar o conjunto de dados.

  3. No painel de detalhes, clique em Criar conjunto de dados.

  4. Em ID do conjunto de dados, digite shared_views.

  5. Mantenha todas as outras configurações padrão e clique em Criar conjunto de dados.

Java

Antes de testar essa amostra, siga as instruções de configuração para Java no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Java.

// Create a separate dataset to store your view
Dataset sharedDataset = bigquery.create(DatasetInfo.of(sharedDatasetId));

Python

Antes de testar essa amostra, siga as instruções de configuração para Python no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Python.

shared_dataset_id = "shared_views"
shared_dataset_id_full = "{}.{}".format(client.project, shared_dataset_id)

shared_dataset = bigquery.Dataset(shared_dataset_id_full)
shared_dataset.location = "US"
shared_dataset = client.create_dataset(shared_dataset)  # API request

Criar a visualização no novo conjunto de dados

No novo conjunto de dados, crie a visualização que pretende autorizar. É a visualização que você compartilha com seus analistas de dados. Ela é criada com uma consulta SQL que exclui as colunas que você não quer que os analistas de dados vejam.

Neste tutorial, sua visualização compartilhada exclui todas as informações do autor, exceto o nome, e todas as informações do autor da confirmação, exceto o nome dele.

Para criar a visualização no novo conjunto de dados:

Console

  1. No Console do Cloud, abra a página do BigQuery.

    Ir para o BigQuery

  2. Clique em Escrever nova consulta.

  3. Copie e cole a consulta a seguir na área de texto do Editor de consultas. Substitua project_id pelo ID do projeto.

    SELECT
      commit,
      author.name as author,
      committer.name as committer,
      repo_name
    FROM
      `project_id.github_source_data.github_contributors`
    
  4. Clique em Mais e selecione Configurações de consulta.

  5. Em Dialeto SQL, selecione Padrão. Clique em Salvar para atualizar as configurações de consulta.

  6. Na lista suspensa Salvar, selecione Salvar visualização.

  7. Na caixa de diálogo Salvar visualização, faça o seguinte:

    • Em Nome do projeto, verifique se o projeto está selecionado.
    • Em Nome do conjunto de dados, verifique se shared_views está selecionado.
    • Em Nome da tabela, digite: github_analyst_view.
    • Clique em Salvar.

Java

Antes de testar essa amostra, siga as instruções de configuração para Java no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Java.

// Create the view in the new dataset
String viewQuery =
    String.format(
        "SELECT commit, author.name as author, committer.name as committer, repo_name FROM %s.%s.%s",
        projectId, sourceDatasetId, sourceTableId);

ViewDefinition viewDefinition = ViewDefinition.of(viewQuery);

Table view =
    bigquery.create(TableInfo.of(TableId.of(sharedDatasetId, sharedViewId), viewDefinition));

Python

Antes de testar essa amostra, siga as instruções de configuração para Python no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Python.

shared_view_id = "github_analyst_view"
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id
)
view = client.create_table(view)  # API request

Atribuir aos analistas de dados um papel de IAM para envolvidos no projeto

Para consultar a visualização, seus analistas de dados precisam de permissão para executar jobs de consulta. O papel bigquery.user inclui permissões para executar jobs no projeto, incluindo jobs de consulta. Se você concede a um usuário ou grupo o papel bigquery.user para envolvidos no projeto, o favorecido pode criar conjuntos de dados e executar jobs de consulta em tabelas nesses conjuntos de dados. O papel bigquery.user não dá permissão ao usuário para consultar dados, ver dados da tabela ou visualizar os detalhes do esquema da tabela para conjuntos de dados que não foram criados por esse usuário.

Atribuir aos seus analistas de dados o papel bigquery.user para envolvidos no projeto não permite que eles visualizem ou consultem dados da tabela no conjunto de dados que contém as tabelas consultadas pela visualização. A maioria das pessoas (cientistas de dados, analistas de business intelligence, analistas de dados) em uma empresa precisa ter o papel bigquery.user para envolvidos no projeto.

Ao adicionar um grupo a um papel de IAM, o endereço de e-mail e o domínio têm que estar associados a uma Conta do Google ativa ou a uma conta do Google Apps.

Para atribuir o grupo de analistas de dados ao papel bigquery.user para envolvidos no projeto:

Console

  1. Abra a página "IAM" no Console do Google Cloud.

    Abrir a página do IAM

  2. Clique em Selecionar um projeto.

  3. Selecione o projeto e clique em Abrir.

  4. Na página IAM, clique em Adicionar.

  5. Na caixa de diálogo Adicionar membros:

    • Na caixa Membros, insira o grupo que contém seus analistas de dados (por exemplo, data_analysts@example.com).
    • Na caixa Selecionar um papel, procure o papel Usuário do BigQuery e selecione-o.
    • Clique em Save.

Atribuir controles de acesso ao conjunto de dados que contém a visualização

Para que seus analistas de dados consultem a visualização, eles precisam receber o papel bigquery.dataViewer no conjunto de dados que contém a visualização. O papel bigquery.user concede aos analistas de dados as permissões necessárias para criar jobs de consulta. No entanto, eles não podem consultar a visualização a menos que também tenham o acesso mínimo de bigquery.dataViewer ao conjunto de dados que contém a visualização.

Para conceder acesso bigquery.dataViewer ao conjunto de dados para os analistas de dados, siga estas etapas:

Console

  1. No painel Explorer, selecione o conjunto de dados shared_views.

  2. Clique em Compartilhar conjunto de dados.

  3. Na caixa de texto Adicionar membros, insira o grupo que contém seus analistas de dados (por exemplo, data_analysts@example.com).

  4. Clique em Selecionar papel e selecione BigQuery > Visualizador de dados do BigQuery.

  5. Clique em Add.

  6. Clique em Concluído.

Java

Antes de testar essa amostra, siga as instruções de configuração para Java no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Java.

// Assign access controls to the dataset containing the view
List<Acl> viewAcl = new ArrayList<>(sharedDataset.getAcl());
viewAcl.add(Acl.of(new Acl.Group("example-analyst-group@google.com"), Acl.Role.READER));
sharedDataset.toBuilder().setAcl(viewAcl).build().update();

Python

Antes de testar essa amostra, siga as instruções de configuração para Python no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Python.

# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry("READER", "groupByEmail", analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ["access_entries"]
)  # API request

Autorizar a visualização a acessar o conjunto de dados de origem

Com os controles de acesso criados para o conjunto de dados que contém a visualização, você a adiciona como uma visualização autorizada no conjunto de dados de origem. Isso permite o acesso de visualização aos dados de origem, não ao grupo de analistas de dados.

Para autorizar que a visualização acesse os dados de origem:

Console

  1. No painel Explorer, selecione o conjunto de dados github_source_data.

  2. Clique em Compartilhar conjunto de dados.

  3. No painel de Permissões do conjunto de dados, clique na guia Visualizações autorizadas.

  4. Em Compartilhar visualização autorizada:

    • Em Selecionar projeto, verifique se o projeto está selecionado.
    • Em Selecionar conjunto de dados, selecione shared_views.
    • Em Selecionar visualização, digite o nome da visualização: github_analyst_view.
    • Clique em Add.

  5. Clique em Concluído.

Java

Antes de testar essa amostra, siga as instruções de configuração para Java no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Java.

// Authorize the view to access the source dataset
List<Acl> srcAcl = new ArrayList<>(sourceDataset.getAcl());
srcAcl.add(Acl.of(new Acl.View(view.getTableId())));
sourceDataset.toBuilder().setAcl(srcAcl).build().update();

Python

Antes de testar essa amostra, siga as instruções de configuração para Python no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Python.

access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, "view", view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ["access_entries"]
)  # API request

Verificar a configuração

Quando a configuração estiver concluída, um membro do seu grupo de analistas de dados (por exemplo, data_analysts) poderá verificar a configuração consultando a visualização.

Para verificar a configuração:

Console

  1. Peça para um membro do grupo de analistas de dados acessar a página do BigQuery no Console do Cloud.

    Ir para o BigQuery

  2. Clique em Escrever nova consulta.

  3. Copie e cole a consulta a seguir na área de texto do Editor de consultas. Substitua project_id pelo ID do projeto.

    SELECT
      *
    FROM
      `project_id.shared_views.github_analyst_view`
    

Código-fonte completo

Veja aqui o código-fonte completo do tutorial da sua referência.

Java

Antes de testar essa amostra, siga as instruções de configuração para Java no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Java.

// Create a source dataset to store your table.
Dataset sourceDataset = bigquery.create(DatasetInfo.of(sourceDatasetId));

// Populate a source table
String tableQuery =
    "SELECT commit, author, committer, repo_name"
        + " FROM `bigquery-public-data.github_repos.commits`"
        + " LIMIT 1000";
QueryJobConfiguration queryConfig =
    QueryJobConfiguration.newBuilder(tableQuery)
        .setDestinationTable(TableId.of(sourceDatasetId, sourceTableId))
        .build();
bigquery.query(queryConfig);

// Create a separate dataset to store your view
Dataset sharedDataset = bigquery.create(DatasetInfo.of(sharedDatasetId));

// Create the view in the new dataset
String viewQuery =
    String.format(
        "SELECT commit, author.name as author, committer.name as committer, repo_name FROM %s.%s.%s",
        projectId, sourceDatasetId, sourceTableId);

ViewDefinition viewDefinition = ViewDefinition.of(viewQuery);

Table view =
    bigquery.create(TableInfo.of(TableId.of(sharedDatasetId, sharedViewId), viewDefinition));

// Assign access controls to the dataset containing the view
List<Acl> viewAcl = new ArrayList<>(sharedDataset.getAcl());
viewAcl.add(Acl.of(new Acl.Group("example-analyst-group@google.com"), Acl.Role.READER));
sharedDataset.toBuilder().setAcl(viewAcl).build().update();

// Authorize the view to access the source dataset
List<Acl> srcAcl = new ArrayList<>(sourceDataset.getAcl());
srcAcl.add(Acl.of(new Acl.View(view.getTableId())));
sourceDataset.toBuilder().setAcl(srcAcl).build().update();

Python

Antes de testar essa amostra, siga as instruções de configuração para Python no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Python.

# Create a source dataset
from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = "github_source_data"
source_dataset_id_full = "{}.{}".format(client.project, source_dataset_id)

source_dataset = bigquery.Dataset(source_dataset_id_full)
# Specify the geographic location where the dataset should reside.
source_dataset.location = "US"
source_dataset = client.create_dataset(source_dataset)  # API request

# Populate a source table
source_table_id = "github_contributors"
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location="US",
    job_config=job_config,
)  # API request - starts the query

query_job.result()  # Waits for the query to finish

# Create a separate dataset to store your view
shared_dataset_id = "shared_views"
shared_dataset_id_full = "{}.{}".format(client.project, shared_dataset_id)

shared_dataset = bigquery.Dataset(shared_dataset_id_full)
shared_dataset.location = "US"
shared_dataset = client.create_dataset(shared_dataset)  # API request

# Create the view in the new dataset
shared_view_id = "github_analyst_view"
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id
)
view = client.create_table(view)  # API request

# Assign access controls to the dataset containing the view
# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry("READER", "groupByEmail", analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ["access_entries"]
)  # API request

# Authorize the view to access the source dataset
access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, "view", view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ["access_entries"]
)  # API request

Limpeza

Para evitar cobranças recorrentes na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

  1. No Console do Cloud, acesse a página Gerenciar recursos:

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

A seguir