使用 BigQuery

BigQuery 是一項多功能的工具,能夠解決儲存及查詢大量資料集的問題,而不需要擔心資料格式、基礎資源,以及其他會妨礙您專心分析的事物。

事前準備

您必須詳閱下列資源:

資料集

如要在 Google 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 物件並將其傳送到其他 cmdlets (例如 Set-BqDataset),藉此控管雲端資源。這個 cmdlet 也可搭配 -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 cmdlet 含有內建的 -Filter 標記,可讓您在建立資料集清單以便和其他 cmdlet 一併處理時,能夠完全控制細節。

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

Datasets 可透過 Remove-BqDataset 指令碼刪除。這個 cmdlet 支援 ShouldProcess (-WhatIf 參數),在刪除非空白 Dataset 之前,會提示使用者確認。在編寫指令碼時,可以使用 -Force 參數略過這項保護措施。

# Deletes $dataset.
$dataset | Remove-BqDataset

資料表

每個 Dataset 都有一些用來保存資料的 TablesTables 可透過 New-BqTable cmdlet 建立,方法是傳入「TableId」TableId和該資料表存放所在的 DatasetDataset 可由物件傳入,或是透過 -DatasetId 參數傳入。Get-BqTableSet-BqTable 的運作方式與上述的 Get-Set- 資料集 cmdlet 相同。

# 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 可透過 Remove-BqTable 指令碼刪除。這個 cmdlet 支援 ShouldProcess (-WhatIf 參數),在刪除含有資料的 Table 之前,會提示使用者確認。可以使用 -Force 參數略過這項保護措施。

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

結構定義

Tables 需要 Schemas 來描述本身包含的資料格式。結構定義可透過 New-BqSchemaSet-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-BqTableRowGet-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 有四種類型:Query、Load、Extract 和 Copy。查詢工作會執行 SQL 樣式查詢,並將結果輸出到資料表中。

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

Load 工作會將 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"

Extract 工作會將 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 工作會將現有的資料表複製到其他新的或現有的資料表中。

# 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 旗標可封鎖 cmdlet,直到工作完成為止。Receive-BqJob 會在查詢工作完成後傳回結果。Get-BqJob 會傳回詳述該工作目前狀態與統計資料的參照物件。Stop-BqJob 會向伺服器傳送要求來停止特定工作,然後立即傳回。

查詢字串中的資料表名稱格式設定注意事項:BigQuery 格式會指定資料表名稱必須以倒引號括住,但倒引號也是 PowerShell 的逸出運算子。因此,倒引號必須再加上第二組倒引號將其逸出。請參閱「Query」工作範例程式碼來取得範例。