BigQuery の使用

BigQuery は、データ形式や基盤となるリソースを気にせずに、膨大なデータセットを格納およびクエリできる汎用的なツールです。

はじめに

次のリソースを確認する必要があります。

データセット

Cloud プロジェクトで BigQuery を使用するには、まず New-BqDataset コマンドレットを使用して Dataset を作成します。これにより、基本的な情報を取得し、サーバー側でリソースを作成します。ローカルには、Dataset 参照オブジェクトが返されます。

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

既存のデータセットの参照オブジェクトを取得するには、Get-BqDataset を使用します。

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

このオブジェクト $dataset を変更し、Set-BqDataset などの別のコマンドレットに渡してクラウド上のリソースを操作できます。このコマンドレットでは、-SetLabel を使用してラベルを追加したり、-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"}

ラベルを使用すると、データセットにタグ(キーワードや値)を付け、検索やフィルタリングを実行できます。Get-BqDataset コマンドレットの -Filter フラグを使用すると、他のコマンドレットで処理するデータセットの一覧を表示するときに、より細かい制御を行うことができます。

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

DatasetsRemove-BqDataset コマンドレットで削除できます。このコマンドレットは ShouldProcess-WhatIf パラメータ)をサポートしており、空でない Dataset を削除する前に確認のプロンプトを表示します。スクリプトを作成するときに -Force パラメータを使用すると、この確認を省略できます。

# Deletes $dataset.
$dataset | Remove-BqDataset

Dataset には、データを保持するために多数の Tables があります。Tables を作成するには、New-BqTable コマンドレットを使用します。このときに、TableIdTableId と、テーブルを入れる Dataset を指定します。Dataset は、オブジェクトまたは -DatasetId パラメータで渡すことができます。Get-BqTableSet-BqTable は、上記の Get-Set- のデータセット コマンドレットと同じように機能します。

# 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

TablesRemove-BqTable コマンドレットで削除できます。このコマンドレットは ShouldProcessShouldProcess(-WhatIf パラメータ)をサポートしているので、削除しようとしている Table の中にデータがある場合はユーザーに確認を求めます。-Force パラメータを使用すると、この確認を省略できます。

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

スキーマ

Tables には、含まれるデータの形式を Schemas に指定する必要があります。スキーマは New-BqSchema コマンドレットと Set-BqSchema コマンドレットで作成します。New-BqSchema に行の書式を指定するときに、パラメータで直接指定することも、行を記述した JSON 配列を使用することもできます。New-BqSchema の結果は常に Set-BqSchema に渡され、Schema オブジェクトを出力するか、既存の Table にスキーマを割り当てることができます。

# 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 オブジェクトは、事前に作成されている場合、Table 作成時にパラメータとして渡すことができます。

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

TableRow

Tables のデータの追加と削除は、行単位で行われます。これらの行には、Add-BqTableRow コマンドレットと Get-BqTableRow コマンドレットでアクセスできます。 Add-BqTableRow は、CSV、JSON、AVRO ファイルを 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

ジョブ

Jobs には、クエリ、読み込み、抽出、コピーの 4 種類があります。クエリジョブは、SQL のようなクエリを実行し、結果をテーブルに出力します。

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

読み込みジョブは、Cloud Storage ファイルを 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"

抽出ジョブは、BigQuery テーブルを Cloud Storage にエクスポートします。

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

コピージョブは、既存のテーブルを新しいテーブルまたは既存のテーブルにコピーします。

# 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 は、これらのジョブを非同期オペレーションとして開始します。ジョブが完了するまでコマンドレットをブロックするには、-PollUntilComplete フラグを使用します。Receive-BqJob は、クエリジョブが完了すると結果を返します。Get-BqJob は、ジョブの現在の状態と統計情報を示す参照オブジェクトを返します。Stop-BqJob は、特定のジョブを停止するリクエストをサーバーに送信してすぐに戻ります。

クエリ文字列内のテーブル名の書式に関する注意: BigQuery では、テーブル名をバッククォートで囲む必要がありますが、バッククォートは Powershell のエスケープ演算子です。このため、バッククォートを重ねてエスケープする必要があります。クエリジョブのサンプルコードをご覧ください。