Use bibliotecas Python de código aberto
Pode escolher entre três bibliotecas Python no BigQuery, com base no seu exemplo de utilização.
| Exemplo de utilização | Mantido por | Descrição | |
|---|---|---|---|
| DataFrames do BigQuery | Processamento de dados e operações de ML baseados em Python com processamento do lado do servidor (por exemplo, através de espaços) | APIs Pandas e Scikit learn implementadas com pushdown do lado do servidor. Para mais informações, consulte o artigo Introdução aos DataFrames do BigQuery. | |
| pandas-gbq | Tratamento de dados baseado em Python com a cópia de dados do lado do cliente | Biblioteca de código aberto mantida pela PyData e colaboradores voluntários | Permite-lhe mover dados para e a partir de DataFrames do Python do lado do cliente. Para mais informações, consulte a documentação e o código fonte. |
| google-cloud-bigquery | Implementação, administração e consultas baseadas em SQL do BigQuery | Biblioteca de código aberto mantida pela Google | Pacote Python que envolve todas as APIs BigQuery. Para mais informações, consulte a documentação e o código fonte. |
Usar o pandas-gbq e o google-cloud-bigquery
A biblioteca pandas-gbq oferece uma interface simples para executar consultas e carregar frames de dados do pandas para o BigQuery. É um wrapper simples
em torno da biblioteca de cliente do BigQuery,
google-cloud-bigquery. Ambas as bibliotecas focam-se em ajudar a realizar a análise de dados através de SQL.
Instale as bibliotecas
Para usar os exemplos de código neste guia, instale o pacote pandas-gbq e as bibliotecas cliente Python do BigQuery.
Instale os pacotes
pandas-gbq e
google-cloud-bigquery.
pip install --upgrade pandas-gbq 'google-cloud-bigquery[bqstorage,pandas]'
A executar consultas
Ambas as bibliotecas suportam a consulta de dados armazenados no BigQuery. As principais diferenças entre as bibliotecas incluem:
| pandas-gbq | google-cloud-bigquery | |
|---|---|---|
| Sintaxe de SQL predefinida | GoogleSQL (configurável com pandas_gbq.context.dialect) |
GoogleSQL |
| Configurações de consultas | Enviado como dicionário no formato de um pedido de consulta. | Use a classe QueryJobConfig, que contém propriedades para as várias opções de configuração da API. |
Consultar dados com a sintaxe do GoogleSQL
O exemplo seguinte mostra como executar uma consulta GoogleSQL com e sem especificar explicitamente um projeto. Para ambas as bibliotecas, se não for especificado um projeto, o projeto é determinado a partir das credenciais predefinidas.
pandas-gbq:
google-cloud-bigquery:
Consultar dados com a sintaxe do SQL antigo
O exemplo seguinte mostra como executar uma consulta com a sintaxe SQL antiga. Consulte o guia de migração do GoogleSQL para ver orientações sobre como atualizar as suas consultas para o GoogleSQL.
pandas-gbq:
google-cloud-bigquery:
Usar a API BigQuery Storage para transferir resultados grandes
Use a API BigQuery Storage para acelerar os downloads de grandes resultados 15 a 31 vezes.
pandas-gbq:
google-cloud-bigquery:
Executar uma consulta com uma configuração
O envio de uma configuração com um pedido API do BigQuery é necessário
para realizar determinadas operações complexas, como executar uma consulta parametrizada ou
especificar uma tabela de destino para armazenar os resultados da consulta. Em pandas-gbq, a configuração tem de ser enviada como um dicionário no formato de um pedido de consulta.
No google-cloud-bigquery, são fornecidas classes de configuração de tarefas, como QueryJobConfig, que contêm as propriedades necessárias para configurar tarefas complexas.
O exemplo seguinte mostra como executar uma consulta com parâmetros com nomes.
pandas-gbq:
google-cloud-bigquery:
Carregar um DataFrame do pandas para uma tabela do BigQuery
Ambas as bibliotecas suportam o carregamento de dados de um pandas DataFrame para uma nova tabela no BigQuery. As principais diferenças incluem:
| pandas-gbq | google-cloud-bigquery | |
|---|---|---|
| Suporte de tipos | Converte o DataFrame para o formato CSV antes de o enviar para a API, que não suporta valores aninhados ou de matriz. | Converte o DataFrame para o formato Parquet ou CSV antes de o enviar para a API, que suporta valores aninhados e de matriz. Escolha Parquet para valores de estrutura e matriz e CSV para flexibilidade de serialização de data e hora. O parquet é a escolha predefinida. Tenha em atenção que o pyarrow, que é o motor parquet usado para enviar os dados do DataFrame para a API BigQuery, tem de estar instalado para carregar o DataFrame para uma tabela. |
| Carregue configurações | Opcionalmente, pode especificar um esquema de tabela). | Use a classe LoadJobConfig, que contém propriedades para as várias opções de configuração da API. |
pandas-gbq:
google-cloud-bigquery:
google-cloud-bigquery requer a biblioteca pyarrow para serializar
um pandas DataFrame num ficheiro Parquet.
Instale o pacote pyarrow:
pip install pyarrow
Funcionalidades não suportadas pelo pandas-gbq
Embora a biblioteca pandas-gbq forneça uma interface útil para consultar dados e escrever dados em tabelas, não abrange muitas das funcionalidades da API BigQuery, incluindo, entre outras:
- Gerir conjuntos de dados, incluindo criar novos conjuntos de dados, atualizar propriedades do conjunto de dados> e eliminar conjuntos de dados
- Carregar dados para o BigQuery a partir de formatos que não sejam pandas DataFrames ou de pandas DataFrames com colunas JSON
- Gerir tabelas, incluindo listar tabelas num conjunto de dados, copiar dados de tabelas> e eliminar tabelas
- Exportar dados do BigQuery diretamente para o Cloud Storage
Resolução de problemas relacionados com erros do conjunto de ligações
Error string: Connection pool is full, discarding connection: bigquery.googleapis.com.
Connection pool size: 10
Se usar o objeto cliente do BigQuery predefinido em Python, está
limitado a um máximo de 10 threads, porque o tamanho do conjunto predefinido para o HTTPAdapter do Python
é 10. Para usar mais de 10 associações, crie um objeto personalizado.requests.adapters.HTTPAdapter Por exemplo:
client = bigquery.Client() adapter = requests.adapters.HTTPAdapter(pool_connections=128, pool_maxsize=128,max_retries=3) client._http.mount("https://",adapter) client._http._auth_request.session.mount("https://",adapter) query_job = client.query(QUERY)