Scegli una libreria Python

Puoi scegliere fra tre librerie Python in BigQuery, in base al tuo caso d'uso.

Caso d'uso Gestito da Descrizione
DataFrame BigQuery Operazioni di ML e di elaborazione dei dati basate su Python con elaborazione lato server (ad esempio, utilizzando gli slot) Google Le API di apprendimento di Pandas e Scikit sono implementate con una creatività push-down lato server. Per saperne di più, consulta Introduzione a BigQuery DataFrames.
panda-gbq Elaborazione dei dati basata su Python con la copia dei dati lato client Libreria open source gestita da PyData e da collaboratori volontari Consente di spostare i dati da e verso i DataFrame Python sul lato client. Per ulteriori informazioni, consulta la documentazione e il codice sorgente.
google-cloud-bigquery Deployment, amministrazione e query basate su SQL di BigQuery Libreria open source gestita da Google pacchetto Python che aggrega tutte le API BigQuery. Per ulteriori informazioni, consulta la documentazione e il codice sorgente.

Utilizzo di pandas-gbq e google-cloud-bigquery

La libreria pandas-gbq offre un'interfaccia semplice per l'esecuzione di query e caricando dataframe pandas in BigQuery. È un wrapper sottile intorno alla libreria client di BigQuery, google-cloud-bigquery. Entrambe queste librerie sono incentrate sull'esecuzione di l'analisi dei dati con SQL.

Installa le librerie

Per utilizzare gli esempi di codice in questa guida, installa il pacchetto pandas-gbq e librerie client Python di BigQuery.

Installa il pandas-gbq e google-cloud-bigquery pacchetti.

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

Query in corso

Entrambe le librerie supportano l'esecuzione di query sui dati archiviati in BigQuery. Legenda le differenze tra le librerie includono:

panda-gbq google-cloud-bigquery
Sintassi SQL predefinita GoogleSQL (configurabile con pandas_gbq.context.dialect) GoogleSQL
Configurazioni di query Inviato come dizionario nel formato di una richiesta di query. Utilizza la classe QueryJobConfig, che contiene le proprietà per le varie opzioni di configurazione API.

Esecuzione di query sui dati con la sintassi GoogleSQL

L'esempio seguente mostra come eseguire una query GoogleSQL con e senza che specifichi esplicitamente un progetto. In entrambe le librerie, se un progetto non è specificato, il progetto sarà determinato credenziali predefinite.

pandas-gbq:

import pandas

sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = 'TX'
    LIMIT 100
"""

# Run a Standard SQL query using the environment's default project
df = pandas.read_gbq(sql, dialect="standard")

# Run a Standard SQL query with the project set explicitly
project_id = "your-project-id"
df = pandas.read_gbq(sql, project_id=project_id, dialect="standard")

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = 'TX'
    LIMIT 100
"""

# Run a Standard SQL query using the environment's default project
df = client.query(sql).to_dataframe()

# Run a Standard SQL query with the project set explicitly
project_id = "your-project-id"
df = client.query(sql, project=project_id).to_dataframe()

Esecuzione di query sui dati con la sintassi SQL precedente

L'esempio seguente mostra come eseguire una query utilizzando la sintassi SQL precedente. Consulta le Guida alla migrazione di GoogleSQL per istruzioni sull'aggiornamento delle query a GoogleSQL.

pandas-gbq:

import pandas

sql = """
    SELECT name
    FROM [bigquery-public-data:usa_names.usa_1910_current]
    WHERE state = 'TX'
    LIMIT 100
"""

df = pandas.read_gbq(sql, dialect="legacy")

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = """
    SELECT name
    FROM [bigquery-public-data:usa_names.usa_1910_current]
    WHERE state = 'TX'
    LIMIT 100
"""
query_config = bigquery.QueryJobConfig(use_legacy_sql=True)

df = client.query(sql, job_config=query_config).to_dataframe()

Utilizzo dell'API BigQuery Storage per scaricare risultati di grandi dimensioni

Usa l'API BigQuery Storage per velocizzare l'operazione download di risultati di grandi dimensioni da 15 a 31 volte.

pandas-gbq:

import pandas

sql = "SELECT * FROM `bigquery-public-data.irs_990.irs_990_2012`"

# Use the BigQuery Storage API to download results more quickly.
df = pandas.read_gbq(sql, dialect="standard", use_bqstorage_api=True)

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = "SELECT * FROM `bigquery-public-data.irs_990.irs_990_2012`"

# The client library uses the BigQuery Storage API to download results to a
# pandas dataframe if the API is enabled on the project, the
# `google-cloud-bigquery-storage` package is installed, and the `pyarrow`
# package is installed.
df = client.query(sql).to_dataframe()

Esecuzione di una query con una configurazione

È obbligatorio inviare una configurazione con una richiesta API BigQuery eseguire determinate operazioni complesse, come l'esecuzione di una query con parametri specificando una tabella di destinazione in cui archiviare i risultati della query. In pandas-gbq, la configurazione deve essere inviata come dizionario nel formato di una richiesta di query. In google-cloud-bigquery vengono fornite classi di configurazione dei job, ad esempio QueryJobConfig, che contengono le proprietà necessarie per configurare job complessi.

L'esempio seguente mostra come eseguire una query con parametri denominati.

pandas-gbq:

import pandas

sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = @state
    LIMIT @limit
"""
query_config = {
    "query": {
        "parameterMode": "NAMED",
        "queryParameters": [
            {
                "name": "state",
                "parameterType": {"type": "STRING"},
                "parameterValue": {"value": "TX"},
            },
            {
                "name": "limit",
                "parameterType": {"type": "INTEGER"},
                "parameterValue": {"value": 100},
            },
        ],
    }
}

df = pandas.read_gbq(sql, configuration=query_config)

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = @state
    LIMIT @limit
"""
query_config = bigquery.QueryJobConfig(
    query_parameters=[
        bigquery.ScalarQueryParameter("state", "STRING", "TX"),
        bigquery.ScalarQueryParameter("limit", "INTEGER", 100),
    ]
)

df = client.query(sql, job_config=query_config).to_dataframe()

Caricamento di un DataFrame pandas in una tabella BigQuery

Entrambe le librerie supportano il caricamento di dati da un DataFrame pandas a una nuova tabella in in BigQuery. Le differenze principali includono:

panda-gbq google-cloud-bigquery
Tipo di supporto Converte il DataFrame in formato CSV prima dell'invio all'API, che non supporta valori nidificati o array. Converte il DataFrame nel formato Parquet o CSV prima dell'invio all'API, che supporta valori nidificati e array. Scegli Parquet per i valori di struct e array e CSV per la flessibilità della serializzazione di date e ore. Parquet è la scelta predefinita. Tieni presente che pyarrow, che è il motore Parquet utilizzato per inviare i dati DataFrame all'API BigQuery, deve essere installato per caricare il DataFrame in una tabella.
Carica configurazioni Facoltativamente, puoi specificare uno schema della tabella. Utilizza la classe LoadJobConfig, che contiene le proprietà per le varie opzioni di configurazione API.

pandas-gbq:

import pandas

df = pandas.DataFrame(
    {
        "my_string": ["a", "b", "c"],
        "my_int64": [1, 2, 3],
        "my_float64": [4.0, 5.0, 6.0],
        "my_timestamp": [
            pandas.Timestamp("1998-09-04T16:03:14"),
            pandas.Timestamp("2010-09-13T12:03:45"),
            pandas.Timestamp("2015-10-02T16:00:00"),
        ],
    }
)
table_id = "my_dataset.new_table"

df.to_gbq(table_id)

google-cloud-bigquery:

Il pacchetto google-cloud-bigquery richiede la libreria pyarrow per la serializzazione un DataFrame pandas in un file Parquet.

Installa il pacchetto pyarrow:

 pip install pyarrow

from google.cloud import bigquery
import pandas

df = pandas.DataFrame(
    {
        "my_string": ["a", "b", "c"],
        "my_int64": [1, 2, 3],
        "my_float64": [4.0, 5.0, 6.0],
        "my_timestamp": [
            pandas.Timestamp("1998-09-04T16:03:14"),
            pandas.Timestamp("2010-09-13T12:03:45"),
            pandas.Timestamp("2015-10-02T16:00:00"),
        ],
    }
)
client = bigquery.Client()
table_id = "my_dataset.new_table"
# Since string columns use the "object" dtype, pass in a (partial) schema
# to ensure the correct BigQuery data type.
job_config = bigquery.LoadJobConfig(
    schema=[
        bigquery.SchemaField("my_string", "STRING"),
    ]
)

job = client.load_table_from_dataframe(df, table_id, job_config=job_config)

# Wait for the load job to complete.
job.result()

Funzionalità non supportate da pandas-gbq

Sebbene la libreria pandas-gbq fornisca un'interfaccia utile per l'esecuzione di query sui dati, e scrivere dati nelle tabelle, non copre molte delle Funzionalità dell'API BigQuery, incluse, a titolo esemplificativo:

Risoluzione degli errori del pool di connessioni

Stringa di errore: Connection pool is full, discarding connection: bigquery.googleapis.com. Connection pool size: 10

Se utilizzi l'oggetto client BigQuery predefinito in Python, limitato a un massimo di 10 thread poiché la dimensione predefinita del pool per HTTPAdapter Python è 10. Per utilizzare più di 10 connessioni, crea una requests.adapters.HTTPAdapter personalizzata . Ad esempio:

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)