Como fazer download de dados do BigQuery para o pandas usando a API BigQuery Storage

A API BigQuery Storage fornece acesso rápido aos dados armazenados no BigQuery. Use essa API para fazer o download de dados armazenados no BigQuery para utilização em ferramentas de análise, como a biblioteca pandas para Python.

Objetivos

  • fará o download dos resultados das consultas para um DataFrame do pandas usando a API BigQuery Storage a partir dos comandos mágicos do IPython para BigQuery em um notebook Jupyter;
  • fará o download dos resultados da consulta para um DataFrame do pandas usando a biblioteca de cliente do BigQuery para Python;
  • fará o download dos dados da tabela do BigQuery para um DataFrame do pandas usando a biblioteca de cliente do BigQuery para Python;
  • fará o download dos dados da tabela do BigQuery para um DataFrame do pandas usando a biblioteca de cliente da API BigQuery Storage para Python.

Custos

O BigQuery é um produto pago. Você paga pelas consultas que executa nele. O primeiro 1 TB de dados de consulta processados por mês é gratuito. Para mais informações, consulte a página Preços do BigQuery.

A API BigQuery Storage é um produto pago. Você paga pelos dados da tabela que verifica durante o download de um DataFrame. Para mais informações, consulte a página Preços do BigQuery.

Antes de começar

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

  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. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como verificar se o faturamento está ativado em um projeto.

  4. 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

  5. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como verificar se o faturamento está ativado em um projeto.

  6. O BigQuery é ativado automaticamente em novos projetos. Para ativar o BigQuery em um projeto preexistente,

    Ative as APIs BigQuery, BigQuery Storage API.

    Ative as APIs

  7. Configure um ambiente de desenvolvimento para Python
    Configurar Python
  8. Configure a autenticação para seu ambiente de desenvolvimento.
    Configurar a autenticação

Antes de terminar este tutorial, também é necessário se familiarizar com os comandos mágicos do IPython para BigQuery (em inglês), a biblioteca de cliente do BigQuery e como usar a biblioteca de cliente com pandas (em inglês).

Instalar as bibliotecas de cliente

Instale a biblioteca de cliente Python para BigQuery versão 1.9.0 (em inglês) ou superior e a biblioteca de cliente Python da API BigQuery Storage.

PIP

Instale os pacotes google-cloud-bigquery e google-cloud-bigquery-storage.

pip install --upgrade 'google-cloud-bigquery[bqstorage,pandas]'

Conda

Instale os pacotes Conda do BigQuery e da API BigQuery Storage (páginas em inglês) usando o canal conda-forge gerenciado pela comunidade.

conda install -c conda-forge google-cloud-bigquery \
  google-cloud-bigquery-storage \
  pandas \
  pyarrow

Fazer download dos resultados da consulta usando os comandos mágicos do IPython para BigQuery

Inicie o servidor do Jupyter Notebook e crie um notebook. Carregue os comandos mágicos do IPython para BigQuery usando o comando mágico %load_ext.

%load_ext google.cloud.bigquery

A partir da versão 1.26.0 do pacote google-cloud-bigquery do Python, a API BigQuery Storage é usada por padrão para fazer o download dos resultados dos comandos mágicos %%bigquery.

%%bigquery tax_forms
SELECT * FROM `bigquery-public-data.irs_990.irs_990_2012`

Usar bibliotecas de cliente do Python

Fazer download dos resultados da consulta usando a biblioteca de cliente do BigQuery

Execute uma consulta usando o método query. Chame o método to_dataframe para aguardar a conclusão da consulta e fazer o download dos resultados usando a API BigQuery Storage.

from google.cloud import bigquery

bqclient = bigquery.Client()

# Download query results.
query_string = """
SELECT
CONCAT(
    'https://stackoverflow.com/questions/',
    CAST(id as STRING)) as url,
view_count
FROM `bigquery-public-data.stackoverflow.posts_questions`
WHERE tags like '%google-bigquery%'
ORDER BY view_count DESC
"""

dataframe = (
    bqclient.query(query_string)
    .result()
    .to_dataframe(
        # Optionally, explicitly request to use the BigQuery Storage API. As of
        # google-cloud-bigquery version 1.26.0 and above, the BigQuery Storage
        # API is used by default.
        create_bqstorage_client=True,
    )
)
print(dataframe.head())

Fazer o download dos dados da tabela usando a biblioteca de cliente do BigQuery

Faça o download de todas as linhas em uma tabela usando o método list_rows, que retorna um objeto RowIterator. Faça o download das linhas usando a API BigQuery Storage chamando o método to_dataframe com o argumento bqstorage_client.

from google.cloud import bigquery

bqclient = bigquery.Client()

# Download a table.
table = bigquery.TableReference.from_string(
    "bigquery-public-data.utility_us.country_code_iso"
)
rows = bqclient.list_rows(
    table,
    selected_fields=[
        bigquery.SchemaField("country_name", "STRING"),
        bigquery.SchemaField("fips_code", "STRING"),
    ],
)
dataframe = rows.to_dataframe(
    # Optionally, explicitly request to use the BigQuery Storage API. As of
    # google-cloud-bigquery version 1.26.0 and above, the BigQuery Storage
    # API is used by default.
    create_bqstorage_client=True,
)
print(dataframe.head())

Fazer o download dos dados da tabela usando a biblioteca de cliente da API BigQuery Storage

Use a biblioteca de cliente da API BigQuery Storage diretamente para ter um controle refinado sobre filtros e paralelismo. Quando apenas filtros de linha simples são necessários, uma sessão de leitura da API BigQuery Storage pode ser usada no lugar de uma consulta.

Crie um objeto TableReadOptions para selecionar colunas ou linhas de filtro. Crie uma sessão de leitura usando o método create_read_session.

Se houver algum stream na sessão, comece a ler as linhas a partir dele usando o método read_rows. Execute um loop na propriedade pages. Chame o método to_dataframe para converter uma mensagem em um DataFrame do pandas. Para um melhor desempenho, leia a partir de vários streams em paralelo. Para simplificar, este exemplo de código lê apenas a partir de um único stream.

your_project_id = "project-for-read-session"
from google.cloud import bigquery_storage
from google.cloud.bigquery_storage import types
import pandas

bqstorageclient = bigquery_storage.BigQueryReadClient()

project_id = "bigquery-public-data"
dataset_id = "new_york_trees"
table_id = "tree_species"
table = f"projects/{project_id}/datasets/{dataset_id}/tables/{table_id}"

# Select columns to read with read options. If no read options are
# specified, the whole table is read.
read_options = types.ReadSession.TableReadOptions(
    selected_fields=["species_common_name", "fall_color"]
)

parent = "projects/{}".format(your_project_id)

requested_session = types.ReadSession(
    table=table,
    # Avro is also supported, but the Arrow data format is optimized to
    # work well with column-oriented data structures such as pandas
    # DataFrames.
    data_format=types.DataFormat.ARROW,
    read_options=read_options,
)
read_session = bqstorageclient.create_read_session(
    parent=parent,
    read_session=requested_session,
    max_stream_count=1,
)

# This example reads from only a single stream. Read from multiple streams
# to fetch data faster. Note that the session may not contain any streams
# if there are no rows to read.
stream = read_session.streams[0]
reader = bqstorageclient.read_rows(stream.name)

# Parse all Arrow blocks and create a dataframe.
frames = []
for message in reader.rows().pages:
    frames.append(message.to_dataframe())
dataframe = pandas.concat(frames)
print(dataframe.head())

Limpar

Para evitar cobranças 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.

Exclua o projeto. Você não criou nenhum recurso do BigQuery neste tutorial, mas a exclusão do projeto removerá todos os outros recursos que você criou.

  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