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: non c'è alcuna infrastruttura da gestire e non hai bisogno di un amministratore di database, quindi puoi concentrarti sull'analisi dei dati per trovare insight significativi, utilizzare un ambiente SQL familiare e sfruttare il nostro modello di pagamento a consumo.

In questo codelab, utilizzerai le librerie client di Google Cloud per Python per eseguire query su 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
  • Installare la libreria client Python
  • Come interrogare le opere di Shakespeare
  • Come eseguire query sul set di dati GitHub
  • Come regolare la memorizzazione nella cache e la visualizzazione delle statistiche

Che cosa ti serve

  • Un progetto Google Cloud
  • Un browser, ad esempio Chrome o Firefox
  • Dimestichezza nell'utilizzo di Python

Sondaggio

Come utilizzerai questo tutorial?

Solo lettura Leggilo e completa gli esercizi

Come valuteresti la tua esperienza con Python?

Principiante Livello intermedio Eccellente

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

Principiante Livello intermedio Eccellente

2. Configurazione e requisiti

Configurazione dell'ambiente da seguire in modo 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 progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google e può essere aggiornata 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). La console Cloud genera automaticamente una stringa univoca. di solito non ti importa cosa sia. Nella maggior parte dei codelab, devi fare riferimento all'ID progetto (che solitamente è identificato come PROJECT_ID), quindi, se non ti piace, generane un altro a caso oppure puoi fare un tentativo personalizzato e controllare se è disponibile. Poi c'è "congelato" dopo la creazione del progetto.
  • C'è un terzo valore, il numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare le risorse/le API Cloud. Eseguire questo codelab non dovrebbe costare molto. Per arrestare le risorse in modo da non incorrere in fatturazione oltre questo tutorial, segui eventuali "pulizie" istruzioni riportate alla fine del codelab. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.

Avvia Cloud Shell

Anche se Google Cloud può essere utilizzato 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. Dalla console Cloud, fai clic su Attiva Cloud Shell 853e55310c205094.png.

55efc1aaa7a4d3ad.png

Se non hai mai avviato Cloud Shell, ti viene mostrata una schermata intermedia (below the fold) che descrive di cosa si tratta. In tal caso, fai clic su Continua (e non la vedrai più). Ecco come appare quella singola schermata:

9c92662c6a846a5c.png

Il provisioning e la connessione a Cloud Shell dovrebbero richiedere solo qualche istante.

9f0e51b578fecce5.png

Questa macchina virtuale viene caricata con tutti gli strumenti di sviluppo di cui hai bisogno. Offre una home directory permanente da 5 GB e viene eseguita in Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Gran parte, se non tutto, del lavoro in questo codelab può essere svolto semplicemente con un browser o 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 confermare che il comando gcloud è a conoscenza del 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 deve essere abilitata per impostazione predefinita in tutti i progetti Google Cloud. Per verificare se è vero, usa il comando seguente in Cloud Shell: Dovresti essere nell'elenco BigQuery:

gcloud services list

BigQuery dovrebbe essere elencato:

NAME                              TITLE
bigquery.googleapis.com           BigQuery API

...

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

gcloud services enable bigquery.googleapis.com

4. Autentica le richieste API

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

Innanzitutto, imposta una variabile di ambiente PROJECT_ID:

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

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

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

Quindi, crea le credenziali che il codice Python utilizzerà per accedere come nuovo account di servizio. Crea le seguenti credenziali e salvale come file JSON ~/key.json utilizzando il comando seguente:

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, descritta nel passaggio successivo, per trovare le tue credenziali. La variabile di ambiente deve essere impostata sul percorso completo del file JSON delle credenziali che hai creato utilizzando:

export GOOGLE_APPLICATION_CREDENTIALS=~/key.json

Scopri 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 offre una serie di ruoli predefiniti (utente, proprietario dati, visualizzatore dati e così via) che puoi assegnare all'account di servizio che hai creato nel passaggio precedente. Puoi scoprire di più sul controllo dell'accesso nella documentazione di BigQuery.

Prima di eseguire query su set di dati pubblici, devi assicurarti che l'account di servizio abbia almeno il ruolo roles/bigquery.user. In Cloud Shell, esegui questo comando per assegnare il ruolo utente all'account di servizio:

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

Per verificare che l'account di servizio abbia il ruolo utente, puoi eseguire questo comando:

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. Interroga le opere di Shakespeare

Per set di dati pubblico si intende qualsiasi set di dati archiviato in BigQuery e reso disponibile al pubblico. Sono disponibili molti altri set di dati pubblici su cui eseguire query. Alcuni set di dati sono ospitati da Google, mentre la maggior parte è ospitata da terze parti. Per maggiori informazioni, 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 di 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 un'applicazione Python semplice che utilizzerai per eseguire gli esempi dell'API Translation.

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

Apri l'editor di codice dall'angolo 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 codice 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 vengono eseguite le query sulla tabella.

Torna in Cloud Shell ed esegui l'app:

python3 app.py

Viene visualizzato un elenco di parole con le 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 familiarità con BigQuery, ora eseguirai una query sul set di dati pubblico GitHub. Troverai i messaggi di commit più comuni su GitHub. Utilizzerai anche la console web di BigQuery per visualizzare in anteprima ed eseguire query ad hoc.

Per vedere l'aspetto dei dati, apri il set di dati GitHub nella UI 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 codice 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,}')

Prenditi un minuto o due per studiare il codice e vedere come vengono eseguite query sulla tabella per i messaggi di commit più comuni.

Torna in Cloud Shell ed esegui l'app:

python3 app.py

Dovresti vedere un elenco di messaggi di commit e le 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 statistica

BigQuery memorizza nella cache i risultati delle query. Di conseguenza, le query successive richiedono meno tempo. È possibile disabilitare la memorizzazione nella cache usando le opzioni di query. BigQuery tiene anche traccia delle statistiche sulle query, ad esempio ora di creazione, ora di fine e byte totali elaborati.

In questo passaggio disattiverai la memorizzazione nella cache e verranno visualizzate anche le statistiche relative alle query.

Vai al file app.py all'interno della cartella bigquery_demo e sostituisci il codice con il codice 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:,}')

Due aspetti da considerare riguardo al codice. Innanzitutto, la memorizzazione nella cache viene disattivata introducendo QueryJobConfig e impostando use_query_cache su false. In secondo luogo, hai eseguito l'accesso alle statistiche sulla query dall'oggetto job.

Torna in Cloud Shell ed esegui l'app:

python3 app.py

Come prima, dovresti vedere un elenco dei messaggi di commit e delle relative occorrenze. Alla fine, dovresti vedere anche 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 i flussi di dati utilizzando gli inserimenti di flussi di dati. Per ulteriori informazioni, consulta la pagina Caricamento di dati in BigQuery.

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

Se ti interessano 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 vedere che contiene l'elenco degli stati degli Stati Uniti e 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 il codice seguente.

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')

Prenditi qualche minuto per studiare in che modo il codice carica il file JSON e crea una tabella con uno schema in un set di dati.

Torna in 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 vedere 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:

  • Nella console Cloud, vai alla pagina Gestisci risorse.
  • Nell'elenco dei progetti, seleziona il progetto e fai clic su Elimina.
  • Nella finestra di dialogo, digita l'ID progetto e 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.