Trabalhar com o BigQuery

O BigQuery é uma ferramenta versátil que resolve o problema do armazenamento e da consulta de conjuntos de dados massivos sem ter de se preocupar com formatos de dados, recursos subjacentes e outras questões que a distraem da sua análise.

Antes de começar

Deve rever os seguintes recursos:

Conjunto de dados

Para usar o BigQuery num Google Cloud projeto, primeiro crie um Dataset com o cmdlet New-BqDataset. Esta ação recebe informações básicas e cria o recurso do lado do servidor. Localmente, é devolvido um Dataset objeto de referência.

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

Para obter um objeto de referência para um conjunto de dados existente, use 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 pode ser modificado e transmitido a outros cmdlets, como Set-BqDataset, para manipular recursos na nuvem. Este cmdlet também processa a adição e a remoção de etiquetas com -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"}

As etiquetas são usadas para etiquetar conjuntos de dados com palavras-chave e/ou valores para que possam ser filtrados e pesquisados mais tarde. O cmdlet Get-BqDataset tem uma flag -Filter integrada que permite um controlo preciso ao listar conjuntos de dados para processamento com outros cmdlets.

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

Datasets pode ser eliminado através do cmdlet Remove-BqDataset. Este cmdlet suporta ShouldProcess (o parâmetro -WhatIf) e pede confirmação ao utilizador antes de eliminar um Dataset não vazio. Esta salvaguarda pode ser ignorada com o parâmetro -Force ao usar scripts.

# Deletes $dataset.
$dataset | Remove-BqDataset

Tabela

Cada Dataset tem um número de Tables para armazenar dados. Tables são criadas com o cmdlet New-BqTable através da introdução de um TableId e do Dataset onde a tabela vai residir. O Dataset pode ser transmitido por objeto ou com o parâmetro -DatasetId. As funções Get-BqTable e Set-BqTable funcionam da mesma forma que os cmdlets do conjunto de dados Get- e Set- acima.

# 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 pode ser eliminado através do cmdlet Remove-BqTable. Este cmdlet suporta ShouldProcess (o parâmetro -WhatIf) e pede confirmação ao utilizador antes de eliminar um Table que contenha dados. Esta salvaguarda pode ser ignorada com o parâmetro -Force.

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

Esquema

Os elementos Tables precisam de Schemas para descrever o formato dos dados que contêm. Os esquemas são criados com os cmdlets New-BqSchema e Set-BqSchema. New-BqSchema pode usar os formatos para linhas como parâmetros diretamente ou como uma matriz JSON de descrições de linhas. Os resultados de New-BqSchema são sempre transmitidos para Set-BqSchema, que pode gerar um objeto Schema ou atribuir o esquema a um 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

Os objetos Schema podem ser transmitidos como parâmetros na criação de Table se forem criados antecipadamente.

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

TableRow

Os dados são adicionados e removidos de Tables em Linhas. Estas linhas são acessíveis através dos cmdlets Add-BqTableRow e Get-BqTableRow. Add-BqTableRow aceita ficheiros CSV, JSON e AVRO para importação para o 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

Empregos

Existem quatro tipos de Jobs: consulta, carregamento, extração e cópia. Os trabalhos de consulta executam consultas no estilo SQL e enviam os resultados para tabelas.

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

As tarefas de carregamento importam ficheiros do Cloud Storage para o 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"

As tarefas de extração exportam tabelas do BigQuery para o Cloud Storage.

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

As tarefas de cópia copiam uma tabela existente para outra tabela nova ou 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 qualquer um destes tipos de tarefas como uma operação assíncrona. Use a flag -PollUntilComplete para que o cmdlet fique bloqueado até que a tarefa esteja concluída. Receive-BqJob devolve os resultados de uma tarefa de consulta assim que esta terminar. Get-BqJob devolve um objeto de referência que detalha o estado atual e as estatísticas da tarefa. Stop-BqJob envia um pedido ao servidor para parar uma determinada tarefa e, em seguida, retorna imediatamente.

Nota sobre a formatação de nomes de tabelas em strings de consulta: o formato do BigQuery especifica que os nomes das tabelas devem estar entre acentos graves, mas os acentos graves também são operadores de escape do PowerShell. Por este motivo, os acentos graves têm de ser escapados adicionando um segundo acento grave. Consulte o código de exemplo de tarefas Query para ver um exemplo.