Confronto con pandas-gbq

La libreria pandas-gbq offre un'interfaccia semplice per l'esecuzione di query e il caricamento dei dataframe dei panda in BigQuery. È un wrapper thin che circonda la libreria client di BigQuery, google-cloud-bigquery. Entrambe queste librerie sono pensate per aiutarti a eseguire l'analisi dei dati tramite SQL. Questo argomento fornisce esempi di codice che confrontano google-cloud-bigquery e pandas-gbq.

Le principali differenze nel livello di funzionalità e di supporto tra le due librerie includono:

panda-gbq google-cloud-bigquery
Assistenza Libreria open source gestita da PyData e dai collaboratori volontari Libreria open source gestita da Google
Funzionalità dell'API BigQuery coperte Esegui query e salva i dati da DataFrames pandas nelle tabelle Funzionalità completa dell'API BigQuery, con supporto aggiuntivo per la lettura/scrittura di DataFrames Pandas e una magia di Jupyter per l'esecuzione di query
docs / fonte docs / fonte

Installa le librerie

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

PIP

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

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

Conda

Installa i pacchetti pandas-gbq e google-cloud-bigquery Conda del canale conda-forge gestito dalla community.

conda install -c conda-forge pandas-gbq google-cloud-bigquery

Esecuzione delle query in corso…

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

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

Esecuzione di query sui dati con la sintassi di GoogleSQL

Il seguente esempio mostra come eseguire una query GoogleSQL con e senza specificare esplicitamente un progetto. Per entrambe le librerie, se un progetto non è specificato, verrà determinato in base alle 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

Il seguente esempio mostra come eseguire una query utilizzando la sintassi SQL precedente. Consulta la guida alla migrazione da GoogleSQL per indicazioni su come aggiornare le 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

Utilizza l'API BigQuery Storage per accelerare da 15 a 31 volte i download di risultati di grandi dimensioni.

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

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

Il seguente esempio 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 dei dati da un DataFrame Pandas a una nuova tabella in BigQuery. Le differenze principali includono:

panda-gbq google-cloud-bigquery
Assistenza relativa al tipo Converte il DataFrame in formato CSV prima dell'invio all'API, che non supporta valori nidificati o array. Converte il formato DataFrame in Parquet o CSV prima dell'invio all'API, che supporta i valori nidificati e array. Scegli Parquet per i valori di struct e array e CSV per la flessibilità di serializzazione di data e ora. 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 DataFrame in una tabella.
Carica configurazioni Inviato come dizionario nel formato specificato nel riferimento REST BigQuery. Utilizza la classe LoadJobConfig, che contiene le proprietà per le varie opzioni di configurazione dell'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 serializzare un DataFrame pandas in un file Parquet.

Installa il pacchetto pyarrow:

 conda install -c conda-forge pyarrow

o

 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 eseguire query e scrivere dati nelle tabelle, non copre molte delle funzionalità dell'API BigQuery, incluse, a titolo esemplificativo: