Utiliser BigQuery

BigQuery est un outil polyvalent qui résout le problème du stockage et de l'interrogation d'ensembles de données volumineux, sans avoir à vous soucier des formats de données, des ressources sous-jacentes ou d'autres éléments qui vous distraient de votre analyse.

Avant de commencer

Nous vous recommandons de consulter les ressources suivantes :

Dataset

Pour utiliser BigQuery dans un projet Cloud, commencez par créer un Dataset (ensemble de données) à l'aide du cmdlet New-BqDataset. Cette opération permettra de créer la ressource côté serveur à partir des informations de base. Localement, un objet de référence Dataset est renvoyé.

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

Pour obtenir un objet de référence pour un ensemble de données existant, utilisez le cmdlet Get-BqDataset.

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

Cet objet $dataset peut être modifié et transmis à d'autres cmdlets, tels que Set-BqDataset, pour manipuler les ressources cloud. Ce cmdlet gère également l'ajout et la suppression de libellés avec -SetLabel et -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"}

Les libellés permettent d'ajouter des tags aux ensembles de données sous forme de mots-clés et/ou de valeurs afin de pouvoir les filtrer et les rechercher ultérieurement. Le cmdlet Get-BqDataset accepte le paramètre -Filter qui permet un contrôle fin lors du listage des ensembles de données à traiter avec d'autres cmdlets.

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

Les Datasets (ensembles de données) peuvent être supprimés par le cmdlet Remove-BqDataset. Ce cmdlet est compatible avec ShouldProcess (paramètre -WhatIf) et demande confirmation à l'utilisateur avant de supprimer un Dataset non vide. Cette protection peut être contournée en spécifiant le paramètre -Force dans le script.

# Deletes $dataset.
$dataset | Remove-BqDataset

Table

Chaque Dataset (ensemble de données) contient plusieurs Tables où sont stockées les données. Ces Tables sont créées avec le cmdlet New-BqTable en transmettant un identifiant de table et leDataset (ensemble de données) dans lequel la table doit être créée. Le Dataset peut être transmis à l'aide d'un objet ou du paramètre -DatasetId. Les cmdlets Get-BqTable et Set-BqTable fonctionnent de la même manière que les cmdlets d'ensemble de données Get- et Set- ci-dessus.

# 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

Les Tables peuvent être supprimées à l'aide du cmdlet Remove-BqTable. Ce cmdlet est compatible avec ShouldProcess (paramètre -WhatIf) et demande confirmation à l'utilisateur avant de supprimer une Table contenant des données. Cette protection peut être contournée en spécifiant le paramètre -Force.

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

Schéma

Les Tables ont besoin de Schemas décrivant le format des données qu'elles contiennent. Les schémas sont créés à l'aide des cmdlets New-BqSchema et Set-BqSchema. Dans le cmdlet New-BqSchema, le format des lignes peut être spécifié directement sous forme de paramètres, ou sous la forme d'un tableau JSON décrivant les lignes. Les résultats du cmdlet New-BqSchema sont toujours transmis au cmdlet Set-BqSchema, qui peut générer un objet Schema ou appliquer le schéma à une Table existante.

# 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

Si les objets Schema sont créés à l'avance, ils peuvent être transmis en tant que paramètres lors de la création des objets Table.

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

Ligne de tableau

À l'intérieur des Tables, les données sont ajoutées dans des lignes, qui peuvent ensuite être supprimées. Ces lignes sont manipulables à l'aide des cmdlets Add-BqTableRow et Get-BqTableRow. Le cmdlet Add-BqTableRow accepte les fichiers d'import aux formats CSV, JSON et AVRO.

# 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

Tâches

Il existe quatre types de Jobs (tâches) : Query (requête), Load (chargement), Extract (extraction) et Copy (copie). Les tâches Query exécutent des requêtes de type SQL et génèrent des résultats dans des tables.

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

Les tâches Load importent des fichiers Cloud Storage dans 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"

Les tâches Extract exportent des tables BigQuery dans Cloud Storage.

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

Les tâches Copy copient une table existante dans une autre table, nouvelle ou existante.

# 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
}

Utilisez le cmdlet Start-BqJob pour démarrer une tâche (quel qu'en soit le type) en tant qu'opération asynchrone. Spécifiez le paramètre -PollUntilComplete si vous souhaitez que le cmdlet attende jusqu'à ce que la tâche se termine. Le cmdlet Receive-BqJob renvoie les résultats d'une tâche "Query" (requête) une fois celle-ci terminée. Le cmdlet Get-BqJob renvoie un objet contenant des renseignements sur l'état actuel et les statistiques de la tâche. Le cmdlet Stop-BqJob envoie une requête au serveur pour arrêter une tâche donnée, puis retourne un résultat immédiatement.

Remarque sur le formatage des noms de table dans les chaînes de requête : le format BigQuery indique que les noms de table doivent être entourés d'accents graves, mais les accents graves sont également les opérateurs d'échappement de PowerShell. Pour cette raison, il convient de doubler les accents graves afin de les protéger. Voir l'exemple de code des tâches Query (Requête) plus haut.