Utilizzo di BigQuery

BigQuery è uno strumento versatile che risolve il problema dell'archiviazione e dell'esecuzione di query su set di dati di grandi dimensioni senza doversi preoccupare di formati dei dati, risorse sottostanti e altri elementi che possono distrarre l'analisi.

Prima di iniziare

Consulta le seguenti risorse:

Set di dati

Per utilizzare BigQuery in un progetto Google Cloud, devi prima creare un Dataset con il Cmdlet New-BqDataset. L'operazione acquisisce le informazioni di base e crea la risorsa lato server. A livello locale, viene restituito un oggetto di riferimento Dataset.

# Makes a new dataset with DatasetId "page_views".
$dataset = New-BqDataset "page_views" -Name "Page Views" `
    -Description "Page views from 2014 onwards"

Per ottenere un oggetto di riferimento per un set di dati esistente, utilizza Get-BqDataset.

# Two ways to get a Dataset: by DatasetId and by Dataset object.
$dataset = Get-BqDataset "page_views"
$dataset = $dataset | Get-BqDataset

Questo oggetto $dataset può essere modificato e trasferito in ulteriori cmdlet come Set-BqDataset per manipolare le risorse cloud. Questo cmdlet gestisce anche l'aggiunta e la rimozione di etichette con -SetLabel e -ClearLabel.

# Updates the Name field of $dataset.
$dataset.Name = "PageView Data"
$dataset = Set-BqDataset "page_views"
# Adds the labels 'department' and 'purpose' to $dataset.
$dataset = Set-BqDataset "page_views" -SetLabel `
    @{"department" = "statistics"; "purpose" = "metrics"}

Le etichette vengono utilizzate per taggare i set di dati con parole chiave e/o valori, in modo da poterli filtrare e cercare in un secondo momento. Il cmdlet Get-BqDataset ha un flag -Filter integrato che consente un controllo granulare durante l'elenco dei set di dati da elaborare con altri cmdlet.

# Filter Datasets by the department label.
$stats = Get-BqDataset -Filter "department:statistics"

Datasets può essere eliminato dal cmdlet Remove-BqDataset. Questo cmdlet supporta ShouldProcess (il parametro -WhatIf) e richiederà la conferma dell'utente prima di eliminare un Dataset non vuoto. Questa protezione può essere bypassata con il parametro -Force durante lo script.

# Deletes $dataset.
$dataset | Remove-BqDataset

Tabella

Ogni Dataset ha un numero di Tables per contenere i dati. Tables vengono creati con il cmdlet New-BqTable passando un valore TableId e il valore Dataset in cui risiede la tabella. Dataset può essere trasmesso per oggetto o con il parametro -DatasetId. Get-BqTable e Set-BqTable funzionano allo stesso modo dei cmdlet del set di dati Get- e Set- riportati sopra.

# Creates a new table in the dataset from above.
$table = $dataset | New-BqTable "logs2014" `
    -Description "Log data from Jan 2014 to Dec 2014 inclusive"

# Gets a reference object for "page_views:logs2014".
$table = Get-BqTable "logs2014" -DatasetId "page_views"

# Modifies the Name attribute of logs2014.
$table.Name = "Logs 2014"
$table = $table | Set-BqTable

Tables può essere eliminato dal cmdlet Remove-BqTable. Questo cmdlet supporta ShouldProcess (il parametro -WhatIf) e richiederà la conferma dell'utente prima di eliminare un Table che contiene dati. Questa salvaguardia può essere ignorata con il parametro -Force.

# Deletes $table.
$table | Remove-BqTable -Force

Schema

Tables deve avere Schemas per descrivere il formato dei dati che contiene. Gli schemi vengono creati con i cmdlet New-BqSchema e Set-BqSchema. New-BqSchema può assumere i formati delle righe direttamente come parametri o come array JSON di descrizioni delle righe. I risultati di New-BqSchema vengono sempre trasferiti a Set-BqSchema, che può restituire un oggetto Schema o assegnare lo schema a un oggetto Table esistente.

# Assigns a Schema to $table
$table = Get-BqTable "logs2014" -DatasetId "page_views"
New-BqSchema "Page" "STRING" | New-BqSchema "Referrer" "STRING" |
    New-BqSchema "Timestamp" "DATETIME" | Set-BqSchema $table

# Creates a schema object to be used in multiple tables.
$schema = New-BqSchema "Page" "STRING" | New-BqSchema "Referrer" "STRING" |
    New-BqSchema "Timestamp" "DATETIME" | Set-BqSchema

Schema oggetti possono essere trasmessi come parametri nella creazione Table se vengono creati in anticipo.

# Creates a new table with the Schema object from above.
$table = $dataset | New-BqTable "logs2014" -Schema $schema

TableRow

I dati vengono aggiunti e rimossi da Tables in Righe. Queste righe sono accessibili utilizzando i cmdlet Add-BqTableRow e Get-BqTableRow. Add-BqTableRow prende i file CSV, JSON e AVRO per essere importati in BigQuery.

# Ingests a CSV file and appends its rows onto the table 'my_dataset:my_table'.
$table = New-BqTable "logs2014" -DatasetId "page_views"
$table | Add-BqTableRow CSV $filename -SkipLeadingRows 1 `
                                      -WriteMode WriteAppend

# Returns a list of the rows in 'page_views:logs2014'.
$list = Get-BqTable "logs2014" -DatasetID "page_views" | Get-BqTableRow

Job

Esistono quattro tipi di Jobs: Query, Carica, Estrai e Copia. I job query eseguono query in stile SQL e restituiscono i risultati alle tabelle.

# Query Job: starts a query and outputs results into $table.
Start-BqJob -Query "SELECT * FROM ``page_views:logs2014``" `
            -Destination $table

I job di caricamento importano i file di Cloud Storage in BigQuery.

# Load Job: adds TableRows to $table from the file specified
# on Cloud Storage.
$job = $dest_table | Start-BqJob `
    -Load CSV "gs://page_views/server_logs_raw_2014.csv"

I job di estrazione esportano le tabelle BigQuery in Cloud Storage.

# Extract Job: exports $src_table to a Cloud Storage file.
$job = $src_table | Start-BqJob `
    -Extract CSV "gs://page_views/logs2014.csv"

I job di copia copiano una tabella esistente in un'altra tabella nuova o esistente.

# Copy Job: Starts a copy job, cancels it, and polls until the job is completely done.
$job = $table | Start-BqJob -Copy $dest_table
$result = $job | Stop-BqJob
while ($result.Status.State -ne "DONE") {
    $result = $result | Get-BqJob
}

Start-BqJob avvia uno qualsiasi di questi tipi di job come un'operazione asincrona. Utilizza il flag -PollUntilComplete per bloccare il cmdlet fino al completamento del job. Receive-BqJob restituirà i risultati di un job di query una volta completato. Get-BqJob restituirà un oggetto di riferimento con i dettagli dello stato corrente e delle statistiche del job. Stop-BqJob invierà una richiesta al server per arrestare un determinato job, quindi tornerà immediatamente.

Nota sulla formattazione dei nomi delle tabelle all'interno delle stringhe di query: il formato BigQuery specifica che i nomi delle tabelle devono essere racchiusi tra apici inversi, ma sono anche operatori di escape di PowerShell. Per questo motivo, è necessario eseguire l'escape di un apice inverso aggiungendo un secondo apice inverso. Per un esempio, vedi l'esempio di codice dei job di query.