Trabajo con BigQuery

BigQuery es una herramienta versátil que resuelve el problema de almacenar y consultar conjuntos de datos masivos sin tener que preocuparse por los formatos de datos, los recursos subyacentes y otros aspectos que te distraen de tu análisis.

Antes de comenzar

Debes revisar los siguientes recursos:

Conjunto de datos

Para usar BigQuery en un proyecto de Google Cloud, primero crea un Dataset con el cmdlet New-BqDataset. Con esto, se toma información básica y se crea el recurso del lado del servidor. De forma local, se muestra un objeto de referencia Dataset.

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

A fin de obtener un objeto de referencia para un conjunto de datos existente, usa Get-BqDataset.

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

Este objeto $dataset se puede modificar y pasar a otros cmdlets como Set-BqDataset para manipular los recursos de la nube. Este complemento también controla la adición y eliminación de etiquetas con -SetLabel y -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"}

Las etiquetas se usan a fin de etiquetar conjuntos de datos con palabras clave o valores para que se puedan filtrar y buscar más adelante. El complemento Get-BqDataset tiene una marca -Filter integrada que permite un control detallado cuando se enumeran conjuntos de datos para procesar con otros cmdlets.

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

Datasets se puede borrar con el cmdlet Remove-BqDataset. Este cmdlet admite ShouldProcess (el parámetro -WhatIf) y solicitará la confirmación del usuario antes de borrar un elemento Dataset que no esté vacío. Esta protección se puede omitir con el parámetro -Force durante la secuencia de comandos.

# Deletes $dataset.
$dataset | Remove-BqDataset

Tabla

Cada Dataset tiene una cantidad de Tables para contener datos. Los Tables se crean con el cmdlet New-BqTable cuando se pasa un TableId y el Dataset donde residirá la tabla. Dataset se puede pasar por objeto o con el parámetro -DatasetId. Get-BqTable y Set-BqTable funcionan de la misma manera que los cmdlets de conjuntos de datos Get- y Set- anteriores.

# 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 se puede borrar con el cmdlet Remove-BqTable. Este cmdlet admite ShouldProcess (el parámetro -WhatIf) y solicitará la confirmación del usuario antes de borrar un Table que contenga datos. Esta protección se puede omitir con el parámetro -Force.

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

Schema

Tables necesita Schemas para describir el formato de los datos que contienen. Los esquemas se crean con los cmdlets New-BqSchema y Set-BqSchema. New-BqSchema puede tomar los formatos de las filas como parámetros directamente o como un array JSON de descripciones de filas. Los resultados de New-BqSchema siempre se pasan a Set-BqSchema, que puede generar un objeto Schema o asignar el esquema a un Table existente.

# 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

Los objetos Schema se pueden pasar como parámetros en la creación de Table si se crean con anticipación.

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

TableRow

Los datos se agregan y se quitan de Tables en Filas. Se puede acceder a estas filas con los cmdlets Add-BqTableRow y Get-BqTableRow. Add-BqTableRow toma archivos CSV, JSON y AVRO para importarlos a 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

Trabajos

Hay cuatro tipos de Jobs: Consulta, carga, extracción y copia. Los trabajos de consulta ejecutan consultas de estilo SQL y generan resultados en tablas.

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

Los trabajos de carga importan archivos de Cloud Storage en 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"

Los trabajos de extracción exportan tablas de BigQuery a Cloud Storage.

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

Los trabajos de copia copian una tabla existente a otra tabla nueva o existente.

# 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 inicia cualquiera de estos tipos de trabajos como una operación asíncrona. Usa la marca -PollUntilComplete para tener el bloque de cmdlet hasta que el trabajo esté hecho. Receive-BqJob mostrará los resultados de un trabajo de consulta una vez que haya finalizado. Get-BqJob mostrará un objeto de referencia que detalla el estado actual y las estadísticas del trabajo. Stop-BqJob enviará una solicitud al servidor para detener un trabajo determinado y, luego, regresará de inmediato.

Nota sobre el formato de los nombres de las tablas dentro de las strings de consulta: El formato de BigQuery especifica que los nombres de las tablas deben estar rodeados por acentos graves, pero los acentos graves también son operadores de escape de PowerShell. Debido a esto, los acentos graves deben escaparse cuando agregues un segundo acento grave. Consulta el código de muestra de trabajos de consulta para ver un ejemplo.