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 doverti preoccupare di formati dei dati, risorse sottostanti e altri elementi che ti distraggono dall'analisi.

Prima di iniziare

Ti consigliamo di esaminare le seguenti risorse:

Set di dati

Per utilizzare BigQuery in un progetto Google Cloud, crea prima un Dataset utilizzando il cmdlet New-BqDataset. Vengono acquisite informazioni di base e viene creata la risorsa lato server. A livello locale viene restituito un Dataset oggetto di riferimento.

# 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 passato ad altri 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 che possano essere filtrati e cercati 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 richiede la conferma dell'utente prima di eliminare un Dataset non vuoto. Questa salvaguardia può essere aggirata con il parametro -Force durante la creazione di script.

# Deletes $dataset.
$dataset | Remove-BqDataset

Tabella

Ogni Dataset ha un numero di Tables per memorizzare i dati. Le Tables vengono create con il cmdlet New-BqTable passando un TableId e il Dataset in cui risiederà la tabella. Dataset può essere passato per oggetto o con il parametro -DatasetId. Get-BqTable e Set-BqTable funzionano nello 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 (parametro -WhatIf) e richiede all'utente di confermare prima di eliminare un Table contenente dati. Questa salvaguardia può essere aggirata con il parametro -Force.

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

Schema

Tables ha bisogno di Schemas per descrivere il formato dei dati in esso contenuti. Gli schemi vengono creati con i cmdlet New-BqSchema e Set-BqSchema. New-BqSchema può accettare i formati per le righe come parametri direttamente o come array JSON delle descrizioni delle righe. I risultati di New-BqSchema vengono sempre passati a Set-BqSchema, che può produrre un oggetto Schema o assegnare lo schema a un 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

Gli oggetti Schema possono essere passati come parametri durante la creazione di 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 importa file CSV, JSON e AVRO 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, Load, Extract e Copy. I job Query eseguono query in stile SQL e generano risultati nelle tabelle.

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

I job Load 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 Extract 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 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 qualsiasi tipo di job come operazione asincrona. Utilizza il flag -PollUntilComplete per bloccare il cmdlet finché il job non è completato. Receive-BqJob restituirà i risultati di un job di query al termine. Get-BqJob restituirà un oggetto di riferimento che descrive lo stato corrente e le statistiche del job. Stop-BqJob invierà una richiesta al server per interrompere un determinato job, quindi restituirà 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 barre graffe, ma le barre graffe sono anche operatori di escape di PowerShell. Per questo motivo, è necessario aggiungere un secondo carattere a capo per eseguire l'escapismo. Per un esempio, consulta il codice di esempio dei job Query.