Como usar o BigQuery com Python

1. Visão geral

O BigQuery é o data warehouse de análise de baixo custo, totalmente gerenciado e em escala de petabytes criado pelo Google para a análise de dados. O BigQuery é NoOps. Não há infraestrutura para gerenciar e você não precisa de um administrador de banco de dados. Assim, você pode se concentrar na análise de dados para encontrar insights significativos, usar um SQL conhecido e aproveitar nosso modelo de pagamento por uso.

Neste codelab, você vai usar as bibliotecas de cliente do Google Cloud para Python para consultar conjuntos de dados públicos do BigQuery com Python.

O que você vai aprender

  • Como usar o Cloud Shell
  • Como ativar a API BigQuery
  • Como autenticar solicitações de API
  • Como instalar a biblioteca de cliente do Python
  • Como consultar as obras de Shakespeare
  • Como consultar o conjunto de dados do GitHub
  • Como ajustar o armazenamento em cache e as estatísticas de exibição

O que é necessário

  • Um projeto do Google Cloud
  • Um navegador, como o Chrome ou o Firefox
  • Familiaridade com Python

Pesquisa

Como você vai usar este tutorial?

Apenas leitura Ler e fazer os exercícios

Como você classificaria sua experiência com Python?

Iniciante Intermediário Proficiente

Como você classificaria sua experiência de uso dos serviços do Google Cloud?

Iniciante Intermediário Proficiente

2. Configuração e requisitos

Configuração de ambiente autoguiada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. Ele é uma string de caracteres que não é usada pelas APIs do Google e pode ser atualizada a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser alterado após a definição. O Console do Cloud gera automaticamente uma string única, geralmente não importa o que seja. Na maioria dos codelabs, você precisará fazer referência ao ID do projeto, que geralmente é identificado como PROJECT_ID. Então, se você não gostar dele, gere outro ID aleatório ou crie um próprio e veja se ele está disponível. Em seguida, ele fica "congelado" depois que o projeto é criado.
  • Há um terceiro valor, um Número de projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, você precisará ativar o faturamento no Console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e não gerar cobranças além deste tutorial, siga as instruções de "limpeza" encontradas no final do codelab. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Inicie o Cloud Shell

Embora o Google Cloud e o Spanner possam ser operados remotamente do seu laptop, neste codelab usaremos o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.

Ativar o Cloud Shell

  1. No Console do Cloud, clique em Ativar o Cloud Shell853e55310c205094.png.

55efc1aaa7a4d3ad.png

Se você nunca iniciou o Cloud Shell antes, uma tela intermediária (abaixo da dobra) será exibida com a descrição dele. Se esse for o caso, clique em Continuar (e você não verá mais esse aviso). Esta é a aparência dessa tela única:

9c92662c6a846a5c.png

Leva apenas alguns instantes para provisionar e se conectar ao Cloud Shell.

9f0e51b578fecce5.png

Essa máquina virtual tem todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Praticamente todo o seu trabalho neste codelab pode ser feito em um navegador ou no seu Chromebook.

Depois de se conectar ao Cloud Shell, você já estará autenticado e o projeto já estará configurado com seu ID do projeto.

  1. Execute o seguinte comando no Cloud Shell para confirmar que você está autenticado:
gcloud auth list

Resposta ao comando

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Execute o seguinte comando no Cloud Shell para confirmar que o comando gcloud sabe sobre seu projeto:
gcloud config list project

Resposta ao comando

[core]
project = <PROJECT_ID>

Se o projeto não estiver configurado, configure-o usando este comando:

gcloud config set project <PROJECT_ID>

Resposta ao comando

Updated property [core/project].

3. Ativar a API

A API BigQuery precisa estar ativada por padrão em todos os projetos do Google Cloud. É possível verificar se isso é verdade com o seguinte comando no Cloud Shell: Você está listado no BigQuery:

gcloud services list

Você verá o BigQuery listado:

NAME                              TITLE
bigquery.googleapis.com           BigQuery API

...

Caso a API BigQuery não esteja ativada, use o seguinte comando no Cloud Shell para ativá-la:

gcloud services enable bigquery.googleapis.com

4. Autenticar as solicitações de API

Para fazer solicitações à API BigQuery, você precisa usar uma conta de serviço. Uma conta de serviço pertence ao seu projeto e é usada pela biblioteca de cliente Python do Google Cloud para fazer solicitações da API BigQuery. Como qualquer outra conta de usuário, uma conta de serviço é representada por um endereço de e-mail. Nesta seção, você vai usar o SDK Cloud para criar uma conta de serviço e, em seguida, criar as credenciais necessárias para autenticar como a conta de serviço.

Primeiro, defina uma variável de ambiente PROJECT_ID:

export PROJECT_ID=$(gcloud config get-value core/project)

Em seguida, crie uma nova conta de serviço para acessar a API BigQuery usando:

gcloud iam service-accounts create my-bigquery-sa \
  --display-name "my bigquery service account"

Em seguida, crie credenciais que o código Python usará para fazer login como a nova conta de serviço. Crie essas credenciais e salve-as como um arquivo JSON ~/key.json usando o seguinte comando:

gcloud iam service-accounts keys create ~/key.json \
  --iam-account my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com

Por fim, defina a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS, usada pela biblioteca de cliente Python do BigQuery, abordada na próxima etapa, para encontrar suas credenciais. A variável de ambiente deve ser definida para o caminho completo do arquivo JSON de credenciais que você criou. Para isso, use:

export GOOGLE_APPLICATION_CREDENTIALS=~/key.json

Saiba mais sobre a autenticação da API BigQuery.

5. Configurar o controle de acesso

O BigQuery usa o Identity and Access Management (IAM) para gerenciar o acesso aos recursos. O BigQuery tem diversos papéis predefinidos (user, dataOwner, dataViewer etc.) que podem ser atribuídos à conta de serviço criada na etapa anterior. Leia mais sobre controle de acesso nos documentos do BigQuery.

Antes de consultar conjuntos de dados públicos, verifique se a conta de serviço tem pelo menos o papel roles/bigquery.user. No Cloud Shell, execute o seguinte comando para atribuir o papel de usuário à conta de serviço:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member "serviceAccount:my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/bigquery.user"

Execute o seguinte comando para verificar se a conta de serviço tem o papel de usuário:

gcloud projects get-iam-policy $PROJECT_ID

Você verá o seguinte:

bindings:
- members:
  - serviceAccount:my-bigquery-sa@<PROJECT_ID>.iam.gserviceaccount.com
  role: roles/bigquery.user
...

6. Instale a biblioteca de cliente

Instale a biblioteca de cliente Python do BigQuery:

pip3 install --user --upgrade google-cloud-bigquery

Agora você já pode programar com a API BigQuery.

7. Consultar as obras de Shakespeare

Um conjunto de dados público é qualquer conjunto de dados armazenado no BigQuery e disponibilizado para o público em geral. Existem muitos outros conjuntos de dados públicos disponíveis para consulta. Embora alguns conjuntos de dados sejam hospedados pelo Google, a maioria é hospedada por terceiros. Para mais informações, consulte a página Conjuntos de dados públicos.

Além dos conjuntos de dados públicos, o BigQuery fornece um número limitado de tabelas de amostra que você pode consultar. Essas tabelas estão contidas no conjunto de dados bigquery-public-data:samples. A tabela shakespeare no conjunto de dados samples contém um índice de palavras das obras de Shakespeare. Ele informa o número de vezes que cada palavra aparece em cada corpus.

Nesta etapa, você vai consultar a tabela shakespeare.

No Cloud Shell, crie um aplicativo Python simples para executar as amostras da API Translation.

mkdir bigquery-demo
cd bigquery-demo
touch app.py

Abra o editor de código no canto superior direito do Cloud Shell:

b648141af44811a3.png

Navegue até o arquivo app.py dentro da pasta bigquery-demo e substitua o código pelo seguinte.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT corpus AS title, COUNT(word) AS unique_words
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY title
    ORDER BY unique_words
    DESC LIMIT 10
"""
results = client.query(query)

for row in results:
    title = row['title']
    unique_words = row['unique_words']
    print(f'{title:<20} | {unique_words}')

Reserve alguns minutos para estudar o código e ver como a tabela está sendo consultada.

No Cloud Shell, execute o app:

python3 app.py

Você verá uma lista de palavras e suas ocorrências:

hamlet               | 5318
kinghenryv           | 5104
cymbeline            | 4875
troilusandcressida   | 4795
kinglear             | 4784
kingrichardiii       | 4713
2kinghenryvi         | 4683
coriolanus           | 4653
2kinghenryiv         | 4605
antonyandcleopatra   | 4582

8. Consultar o conjunto de dados do GitHub

Para se familiarizar mais com o BigQuery, agora você emitirá uma consulta no conjunto de dados público do GitHub (link em inglês). Você encontrará as mensagens de confirmação mais comuns no GitHub. Você também vai usar o console da Web do BigQuery para visualizar e executar consultas ad-hoc.

Para conferir a aparência dos dados, abra o conjunto de dados do GitHub na IU da Web do BigQuery:

Abrir a tabela github_repos

Clique no botão "Visualizar" para conferir a aparência dos dados:

d3f0dc7400fbe678.png

Navegue até o arquivo app.py dentro da pasta bigquery_demo e substitua o código pelo seguinte.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT subject AS subject, COUNT(*) AS num_duplicates
    FROM bigquery-public-data.github_repos.commits
    GROUP BY subject
    ORDER BY num_duplicates
    DESC LIMIT 10
"""
results = client.query(query)

for row in results:
    subject = row['subject']
    num_duplicates = row['num_duplicates']
    print(f'{subject:<20} | {num_duplicates:>9,}')

Reserve alguns minutos para estudar o código e ver como a tabela está sendo consultada em busca das mensagens de confirmação mais comuns.

No Cloud Shell, execute o app:

python3 app.py

Você verá uma lista de mensagens de confirmação e as ocorrências delas:

Update README.md     | 1,685,515
Initial commit       | 1,577,543
update               |   211,017
                     |   155,280
Create README.md     |   153,711
Add files via upload |   152,354
initial commit       |   145,224
first commit         |   110,314
Update index.html    |    91,893
Update README        |    88,862

9. Armazenamento em cache e estatísticas

O BigQuery armazena em cache os resultados das consultas. Como resultado, as consultas subsequentes levam menos tempo. É possível desativar o armazenamento em cache com opções de consulta. O BigQuery também monitora estatísticas sobre consultas, como horário de criação, horário de término e total de bytes processados.

Nesta etapa, você desativará o armazenamento em cache e também exibirá estatísticas sobre as consultas.

Navegue até o arquivo app.py dentro da pasta bigquery_demo e substitua o código pelo seguinte.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT subject AS subject, COUNT(*) AS num_duplicates
    FROM bigquery-public-data.github_repos.commits
    GROUP BY subject
    ORDER BY num_duplicates
    DESC LIMIT 10
"""
job_config = bigquery.job.QueryJobConfig(use_query_cache=False)
results = client.query(query, job_config=job_config)

for row in results:
    subject = row['subject']
    num_duplicates = row['num_duplicates']
    print(f'{subject:<20} | {num_duplicates:>9,}')

print('-'*60)
print(f'Created: {results.created}')
print(f'Ended:   {results.ended}')
print(f'Bytes:   {results.total_bytes_processed:,}')

Algumas observações sobre o código. Primeiro, o armazenamento em cache é desativado pela introdução de QueryJobConfig e da definição de use_query_cache como falso. Segundo, você acessou as estatísticas sobre a consulta do objeto do trabalho.

No Cloud Shell, execute o app:

python3 app.py

Como antes, você verá uma lista de mensagens de confirmação e as ocorrências delas. Além disso, algumas estatísticas sobre a consulta serão exibidas no final:

Update README.md     | 1,685,515
Initial commit       | 1,577,543
update               |   211,017
                     |   155,280
Create README.md     |   153,711
Add files via upload |   152,354
initial commit       |   145,224
first commit         |   110,314
Update index.html    |    91,893
Update README        |    88,862
------------------------------------------------------------
Created: 2020-04-03 13:30:08.801000+00:00
Ended:   2020-04-03 13:30:15.334000+00:00
Bytes:   2,868,251,894

10. Como carregar dados no BigQuery

Se quiser consultar seus próprios dados, você precisará carregá-los no BigQuery. O BigQuery oferece suporte ao carregamento de dados de muitas fontes, incluindo o Cloud Storage, outros serviços do Google e outras fontes legíveis. Você pode até mesmo transmitir seus dados usando inserções por streaming. Para mais informações, consulte a página Como carregar dados no BigQuery.

Nesta etapa, você vai carregar um arquivo JSON armazenado no Cloud Storage em uma tabela do BigQuery. O arquivo JSON está localizado em gs://cloud-samples-data/bigquery/us-states/us-states.json

Se quiser saber mais sobre o conteúdo do arquivo JSON, use a ferramenta de linha de comando gsutil para fazer o download no Cloud Shell:

gsutil cp gs://cloud-samples-data/bigquery/us-states/us-states.json .

Ele contém a lista de estados dos EUA, e cada estado é um documento JSON em uma linha separada:

head us-states.json
{"name": "Alabama", "post_abbr": "AL"}
{"name": "Alaska", "post_abbr":  "AK"}
...

Para carregar esse arquivo JSON no BigQuery, navegue até o arquivo app.py dentro da pasta bigquery_demo e substitua o código pelo seguinte.

from google.cloud import bigquery

client = bigquery.Client()

gcs_uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json'

dataset = client.create_dataset('us_states_dataset')
table = dataset.table('us_states_table')

job_config = bigquery.job.LoadJobConfig()
job_config.schema = [
    bigquery.SchemaField('name', 'STRING'),
    bigquery.SchemaField('post_abbr', 'STRING'),
]
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON

load_job = client.load_table_from_uri(gcs_uri, table, job_config=job_config)

print('JSON file loaded to BigQuery')

Reserve alguns minutos para estudar como o código carrega o arquivo JSON e cria uma tabela com um esquema em um conjunto de dados.

No Cloud Shell, execute o app:

python3 app.py

Um conjunto de dados e uma tabela são criados no BigQuery.

Para verificar se o conjunto de dados foi criado, acesse o console do BigQuery. Você verá um novo conjunto de dados e uma nova tabela. Alterne para a guia de visualização da tabela para ver seus dados:

8c7d2621820a5ac4.png

11. Parabéns!

Você aprendeu a usar o BigQuery com Python.

Limpeza

Para evitar cobranças dos recursos usados neste tutorial na conta do Google Cloud, siga estas etapas:

  • No console do Cloud, acesse a página Gerenciar recursos.
  • Na lista de projetos, selecione seu projeto e clique em Excluir.
  • Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Saiba mais

Licença

Este conteúdo está sob a licença Atribuição 2.0 Genérica da Creative Commons.