Utilizzo di BigQuery con Python

1. Panoramica

BigQuery è il data warehouse di analisi di Google completamente gestito, a basso costo e con capacità di petabyte. BigQuery è NoOps, ovvero non esistono infrastrutture da gestire e non hai bisogno di un amministratore di database, per cui puoi concentrarti sull'analisi dei dati per trovare informazioni significative, utilizzare un ambiente SQL familiare e sfruttare i vantaggi offerti dal modello di pagamento a consumo.

In questo codelab utilizzerai le librerie client Google Cloud per Python per eseguire query sui set di dati pubblici BigQuery con Python.

Cosa imparerai a fare

  • Come utilizzare Cloud Shell
  • Come abilitare l'API BigQuery
  • Come autenticare le richieste API
  • Come installare la libreria client Python
  • Come eseguire query sulle opere di Shakespeare
  • Come eseguire query sul set di dati GitHub
  • Come regolare le statistiche di memorizzazione nella cache e visualizzazione

Che cosa ti serve

  • Un progetto Google Cloud
  • Un browser, ad esempio Chrome o Firefox
  • Familiarità con l'utilizzo di Python

Sondaggio

Come utilizzerai questo tutorial?

Leggilo e basta Leggilo e completa gli esercizi

Come valuteresti la tua esperienza con Python?

Principiante Intermedio Avanzato

Come valuti la tua esperienza di utilizzo dei servizi Google Cloud?

Principiante Intermedio Avanzato

2. Configurazione e requisiti

Configurazione dell'ambiente autonomo

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Il nome del progetto è il nome visualizzato per i partecipanti a questo progetto. È una stringa di caratteri non utilizzata dalle API di Google e puoi aggiornarla in qualsiasi momento.
  • L'ID progetto deve essere univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). Cloud Console genera automaticamente una stringa univoca, di solito non ti interessa di cosa si tratta. Nella maggior parte dei codelab, devi fare riferimento all'ID progetto (che in genere è identificato come PROJECT_ID), quindi, se non ti piace, generane un altro casuale oppure puoi provare il tuo e vedere se è disponibile. Viene "congelato" dopo la creazione del progetto.
  • Esiste un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, devi abilitare la fatturazione in Cloud Console per utilizzare le risorse/API Cloud. L'esecuzione di questo codelab non dovrebbe costare molto, se non nulla. Per arrestare le risorse in modo da non incorrere in costi di fatturazione al termine di questo tutorial, segui le istruzioni di "pulizia" riportate alla fine del codelab. I nuovi utenti di Google Cloud possono beneficiare del programma prova senza costi di 300$.

Avvia Cloud Shell

Sebbene Google Cloud possa essere gestito da remoto dal tuo laptop, in questo codelab utilizzerai Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.

Attiva Cloud Shell

  1. Nella console Cloud, fai clic su Attiva Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Se non hai mai avviato Cloud Shell, viene visualizzata una schermata intermedia (sotto la piega) che ne descrive le funzionalità. In questo caso, fai clic su Continua e non comparirà più. Ecco come si presenta la schermata intermedia:

9c92662c6a846a5c.png

Bastano pochi istanti per eseguire il provisioning e connettersi a Cloud Shell.

9f0e51b578fecce5.png

Questa macchina virtuale è caricata con tutti gli strumenti per sviluppatori di cui hai bisogno. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni e l'autenticazione della rete. Gran parte del lavoro per questo codelab, se non tutto, può essere svolto semplicemente con un browser o con Chromebook.

Una volta eseguita la connessione a Cloud Shell, dovresti vedere che il tuo account è già autenticato e il progetto è già impostato sul tuo ID progetto.

  1. Esegui questo comando in Cloud Shell per verificare che l'account sia autenticato:
gcloud auth list

Output comando

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Esegui questo comando in Cloud Shell per verificare che il comando gcloud conosca il tuo progetto:
gcloud config list project

Output comando

[core]
project = <PROJECT_ID>

In caso contrario, puoi impostarlo con questo comando:

gcloud config set project <PROJECT_ID>

Output comando

Updated property [core/project].

3. Abilita l'API

L'API BigQuery dovrebbe essere abilitata per impostazione predefinita in tutti i progetti Google Cloud. Puoi verificare se questa affermazione è vera con il seguente comando in Cloud Shell: dovresti visualizzare BigQuery nell'elenco:

gcloud services list

Dovresti visualizzare BigQuery nell'elenco:

NAME                              TITLE
bigquery.googleapis.com           BigQuery API

...

Se l'API BigQuery non è abilitata, puoi utilizzare il seguente comando in Cloud Shell per abilitarla:

gcloud services enable bigquery.googleapis.com

4. Autenticare le richieste API

Per effettuare richieste all'API BigQuery, devi utilizzare un service account. Un service account appartiene al tuo progetto e viene utilizzato dalla libreria client Python di Google Cloud per effettuare richieste all'API BigQuery. Come qualsiasi altro account utente, un service account è rappresentato da un indirizzo email. In questa sezione utilizzerai Cloud SDK per creare un service account e poi creare le credenziali necessarie per l'autenticazione come service account.

Innanzitutto, imposta una variabile di ambiente PROJECT_ID:

export PROJECT_ID=$(gcloud config get-value core/project)

Successivamente, crea un nuovo service account per accedere all'API BigQuery utilizzando:

gcloud iam service-accounts create my-bigquery-sa \
  --display-name "my bigquery service account"

Poi, crea le credenziali che il codice Python utilizzerà per accedere al nuovo service account. Utilizza il seguente comando per creare le credenziali e salvarle in un file JSON ~/key.json:

gcloud iam service-accounts keys create ~/key.json \
  --iam-account my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com

Infine, imposta la variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS, utilizzata dalla libreria client Python di BigQuery, trattata nel passaggio successivo, per trovare le tue credenziali. Il valore della variabile di ambiente deve essere il percorso completo del file JSON delle credenziali che hai creato, utilizzando:

export GOOGLE_APPLICATION_CREDENTIALS=~/key.json

Puoi scoprire di più sull'autenticazione dell'API BigQuery.

5. Configurazione del controllo dell'accesso

BigQuery utilizza Identity and Access Management (IAM) per gestire l'accesso alle risorse. BigQuery dispone di una serie di ruoli predefiniti (utente, dataOwner, dataViewer e così via) che puoi assegnare al service account creato nel passaggio precedente. Puoi scoprire di più sul controllo dell'accesso nella documentazione di BigQuery.

Prima di poter eseguire query sui set di dati pubblici, devi assicurarti che il service account disponga almeno del ruolo roles/bigquery.user. In Cloud Shell, esegui questo comando per assegnare il ruolo utente al service account:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member "serviceAccount:my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/bigquery.user"

Puoi eseguire questo comando per verificare che l'account di servizio disponga del ruolo utente:

gcloud projects get-iam-policy $PROJECT_ID

Dovresti visualizzare quanto segue:

bindings:
- members:
  - serviceAccount:my-bigquery-sa@<PROJECT_ID>.iam.gserviceaccount.com
  role: roles/bigquery.user
...

6. Installa la libreria client

Installa la libreria client Python di BigQuery:

pip3 install --user --upgrade google-cloud-bigquery

Ora puoi iniziare a programmare con l'API BigQuery.

7. Esegui query sulle opere di Shakespeare

Un set di dati pubblico è un set di dati archiviato in BigQuery e reso disponibile al pubblico. Sono disponibili molti altri set di dati pubblici su cui eseguire query. Mentre alcuni set di dati sono ospitati da Google, la maggior parte è ospitata da terze parti. Per saperne di più, consulta la pagina Set di dati pubblici.

Oltre ai set di dati pubblici, BigQuery fornisce un numero limitato di tabelle di esempio su cui puoi eseguire query. Queste tabelle sono contenute nel set di dati bigquery-public-data:samples. La tabella shakespeare nel set di dati samples contiene un indice delle parole delle opere di Shakespeare. Indica il numero di volte in cui ogni parola compare in ciascun corpus.

In questo passaggio, eseguirai una query sulla tabella shakespeare.

Innanzitutto, in Cloud Shell crea una semplice applicazione Python che utilizzerai per eseguire gli esempi dell'API Translation.

mkdir bigquery-demo
cd bigquery-demo
touch app.py

Apri l'editor di codice dalla parte in alto a destra di Cloud Shell:

b648141af44811a3.png

Vai al file app.py all'interno della cartella bigquery-demo e sostituisci il codice con il seguente.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT corpus AS title, COUNT(word) AS unique_words
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY title
    ORDER BY unique_words
    DESC LIMIT 10
"""
results = client.query(query)

for row in results:
    title = row['title']
    unique_words = row['unique_words']
    print(f'{title:<20} | {unique_words}')

Prenditi un minuto o due per studiare il codice e vedere come viene eseguita la query sulla tabella.

Torna a Cloud Shell ed esegui l'app:

python3 app.py

Dovresti visualizzare un elenco di parole e delle relative occorrenze:

hamlet               | 5318
kinghenryv           | 5104
cymbeline            | 4875
troilusandcressida   | 4795
kinglear             | 4784
kingrichardiii       | 4713
2kinghenryvi         | 4683
coriolanus           | 4653
2kinghenryiv         | 4605
antonyandcleopatra   | 4582

8. Esegui una query sul set di dati GitHub

Per acquisire maggiore familiarità con BigQuery, ora eseguirai una query sul set di dati pubblico GitHub. I messaggi di commit più comuni sono disponibili su GitHub. Utilizzerai anche la console web di BigQuery per visualizzare l'anteprima ed eseguire query ad hoc.

Per vedere i dati, apri il set di dati GitHub nell'interfaccia utente web di BigQuery:

Apri la tabella github_repos

Fai clic sul pulsante Anteprima per vedere come appaiono i dati:

d3f0dc7400fbe678.png

Vai al file app.py all'interno della cartella bigquery_demo e sostituisci il codice con il seguente.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT subject AS subject, COUNT(*) AS num_duplicates
    FROM bigquery-public-data.github_repos.commits
    GROUP BY subject
    ORDER BY num_duplicates
    DESC LIMIT 10
"""
results = client.query(query)

for row in results:
    subject = row['subject']
    num_duplicates = row['num_duplicates']
    print(f'{subject:<20} | {num_duplicates:>9,}')

Dedica un minuto o due a studiare il codice e a vedere come viene eseguita la query sulla tabella per i messaggi di commit più comuni.

Torna a Cloud Shell ed esegui l'app:

python3 app.py

Dovresti visualizzare un elenco dei messaggi di commit e delle relative occorrenze:

Update README.md     | 1,685,515
Initial commit       | 1,577,543
update               |   211,017
                     |   155,280
Create README.md     |   153,711
Add files via upload |   152,354
initial commit       |   145,224
first commit         |   110,314
Update index.html    |    91,893
Update README        |    88,862

9. Memorizzazione nella cache e statistiche

BigQuery memorizza nella cache i risultati delle query. Di conseguenza, le query successive richiedono meno tempo. È possibile disattivare la memorizzazione nella cache con le opzioni di query. BigQuery tiene traccia anche delle statistiche sulle query, come l'ora di creazione, l'ora di fine e il numero totale di byte elaborati.

In questo passaggio, disabiliterai la memorizzazione nella cache e visualizzerai anche le statistiche sulle query.

Vai al file app.py all'interno della cartella bigquery_demo e sostituisci il codice con il seguente.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT subject AS subject, COUNT(*) AS num_duplicates
    FROM bigquery-public-data.github_repos.commits
    GROUP BY subject
    ORDER BY num_duplicates
    DESC LIMIT 10
"""
job_config = bigquery.job.QueryJobConfig(use_query_cache=False)
results = client.query(query, job_config=job_config)

for row in results:
    subject = row['subject']
    num_duplicates = row['num_duplicates']
    print(f'{subject:<20} | {num_duplicates:>9,}')

print('-'*60)
print(f'Created: {results.created}')
print(f'Ended:   {results.ended}')
print(f'Bytes:   {results.total_bytes_processed:,}')

Ecco un paio di cose da notare sul codice. Innanzitutto, la memorizzazione nella cache viene disabilitata introducendo QueryJobConfig e impostando use_query_cache su false. In secondo luogo, hai eseguito l'accesso alle statistiche sulla query dall'oggetto job.

Torna a Cloud Shell ed esegui l'app:

python3 app.py

Come prima, dovresti visualizzare un elenco dei messaggi di commit e delle relative occorrenze. Inoltre, alla fine dovresti visualizzare alcune statistiche sulla query:

Update README.md     | 1,685,515
Initial commit       | 1,577,543
update               |   211,017
                     |   155,280
Create README.md     |   153,711
Add files via upload |   152,354
initial commit       |   145,224
first commit         |   110,314
Update index.html    |    91,893
Update README        |    88,862
------------------------------------------------------------
Created: 2020-04-03 13:30:08.801000+00:00
Ended:   2020-04-03 13:30:15.334000+00:00
Bytes:   2,868,251,894

10. Caricamento di dati in BigQuery

Se vuoi eseguire query sui tuoi dati, devi caricarli in BigQuery. BigQuery supporta il caricamento di dati da molte origini, tra cui Cloud Storage, altri servizi Google e altre origini leggibili. Puoi anche trasmettere in streaming i dati utilizzando gli inserimenti in streaming. Per ulteriori informazioni, consulta la pagina Caricamento di dati in BigQuery.

In questo passaggio, caricherai un file JSON archiviato in Cloud Storage in una tabella BigQuery. Il file JSON si trova in gs://cloud-samples-data/bigquery/us-states/us-states.json

Se vuoi conoscere i contenuti del file JSON, puoi utilizzare lo strumento a riga di comando gsutil per scaricarlo in Cloud Shell:

gsutil cp gs://cloud-samples-data/bigquery/us-states/us-states.json .

Puoi notare che contiene l'elenco degli stati degli Stati Uniti e che ogni stato è un documento JSON su una riga separata:

head us-states.json
{"name": "Alabama", "post_abbr": "AL"}
{"name": "Alaska", "post_abbr":  "AK"}
...

Per caricare questo file JSON in BigQuery, vai al file app.py all'interno della cartella bigquery_demo e sostituisci il codice con quanto segue.

from google.cloud import bigquery

client = bigquery.Client()

gcs_uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json'

dataset = client.create_dataset('us_states_dataset')
table = dataset.table('us_states_table')

job_config = bigquery.job.LoadJobConfig()
job_config.schema = [
    bigquery.SchemaField('name', 'STRING'),
    bigquery.SchemaField('post_abbr', 'STRING'),
]
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON

load_job = client.load_table_from_uri(gcs_uri, table, job_config=job_config)

print('JSON file loaded to BigQuery')

Dedica un minuto o due a studiare come il codice carica il file JSON e crea una tabella con uno schema in un set di dati.

Torna a Cloud Shell ed esegui l'app:

python3 app.py

In BigQuery vengono creati un set di dati e una tabella.

Per verificare che il set di dati sia stato creato, vai alla console BigQuery. Dovresti visualizzare un nuovo set di dati e una nuova tabella. Passa alla scheda Anteprima della tabella per visualizzare i dati:

8c7d2621820a5ac4.png

11. Complimenti!

Hai imparato a utilizzare BigQuery con Python.

Pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial:

  • In Cloud Console, vai alla pagina Gestisci risorse.
  • Nell'elenco dei progetti, seleziona il tuo progetto e poi fai clic su Elimina.
  • Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.

Scopri di più

Licenza

Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.