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 | |
---|---|---|---|
BigQuery DataFrames | Elaborazione dei dati e operazioni di ML basate su Python con elaborazione lato server (ad esempio, l'utilizzo di slot) | API Pandas e Scikit Learn implementate con pushdown lato server. Per ulteriori informazioni, consulta Introduzione a BigQuery DataFrames. | |
pandas-gbq | Elaborazione dei dati basata su Python mediante la copia dei dati lato client | Libreria open source gestita da PyData e collaboratori volontari | Consente di spostare i dati da e verso i DataFrame Python sul lato client. Per saperne di più, 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 racchiude 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
.
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. Ecco alcune delle principali differenze tra le librerie:
pandas-gbq | google-cloud-bigquery | |
---|---|---|
Sintassi SQL predefinita | GoogleSQL (configurabile con pandas_gbq.context.dialect ) |
GoogleSQL |
Configurazioni delle 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 dell'API. |
Esecuzione di query sui dati con la sintassi GoogleSQL
L'esempio seguente mostra come eseguire una query GoogleSQL con e senza specificare esplicitamente un progetto. Per entrambe le librerie, se non viene specificato un progetto, questo verrà determinato dalle credenziali predefinite.
pandas-gbq
:
google-cloud-bigquery
:
Esecuzione di query sui dati con la sintassi SQL precedente
L'esempio seguente mostra come eseguire una query utilizzando la sintassi SQL precedente. Consulta la guida alla migrazione a GoogleSQL per indicazioni su come aggiornare le query in GoogleSQL.
pandas-gbq
:
google-cloud-bigquery
:
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
:
google-cloud-bigquery
:
Eseguire 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
sono fornite classi di configurazione dei job, come
QueryJobConfig
,
che contengono le proprietà necessarie per configurare job complessi.
L'esempio seguente mostra come eseguire una query con parametri denominati.
pandas-gbq
:
google-cloud-bigquery
:
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 sono:
pandas-gbq | google-cloud-bigquery | |
---|---|---|
Tipo di supporto | Converte il DataFrame in formato CSV prima di inviarlo all'API, che non supporta valori nidificati o di 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 è l'opzione predefinita. Tieni presente che pyarrow , ovvero il motore Parquet utilizzato per inviare i dati del DataFrame all'API BigQuery, deve essere installato per caricare il DataFrame in una tabella. |
Carica configurazioni | Se vuoi, puoi specificare uno schema della tabella. | Utilizza la classe LoadJobConfig , che contiene le proprietà per le varie opzioni di configurazione API. |
pandas-gbq
:
google-cloud-bigquery
:
google-cloud-bigquery
richiede la libreria pyarrow
per eseguire la serializzazione di un DataFrame Pandas in un file Parquet.
Installa il pacchetto pyarrow
:
pip install pyarrow
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:
- Gestire i set di dati, tra cui creando nuovi set di dati, aggiornando le proprietà del set di dati, ed eliminazione di set di dati
- Caricare dati in BigQuery da diversi da Pandas DataFrames o da Pandas DataFrames con JSON colonne
- Gestire le tabelle, tra cui elencare le tabelle in un set di dati, copiare i dati delle tabelle, ed eliminando le tabelle
- Esportazione dei dati BigQuery direttamente in Cloud Storage
Risolvere i problemi relativi al 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, hai un limite di massimo 10 thread perché la dimensione predefinita del pool per HTTPAdapter di 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)