使用 BigQuery

BigQuery 是一个通用工具,您可以用它来解决存储和查询大量数据集的问题,而不必担心数据格式、底层资源以及其他让您无法专心分析的问题。

准备工作

您应查看以下资源:

数据集

要在 Google Cloud 项目中使用 BigQuery,请先使用 New-BqDataset cmdlet 创建一个 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 并将其传递到其他 cmdlet(例如 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"

Remove-BqDataset cmdlet 可以删除 Datasets。此 cmdlet 支持 ShouldProcess-WhatIf 参数),并会在删除非空 Dataset 之前提示用户确认。编写脚本时,您可以使用 -Force 参数绕过此保护措施。

# Deletes $dataset.
$dataset | Remove-BqDataset

每个 Dataset 都有多个 Tables 来保存数据。您可以使用 New-BqTable cmdlet 通过传入 TableId 和表将驻留的 Dataset 来创建 TablesDataset 可以通过对象或使用 -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

Remove-BqTable cmdlet 可以删除 Tables。此 cmdlet 支持 ShouldProcess-WhatIf 参数),并会在删除包含数据的 Table 之前提示用户确认。您可以使用 -Force 参数绕过此保护措施。

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

架构

Tables 需要使用 Schemas 来描述所包含数据的格式。您可以使用 New-BqSchemaSet-BqSchema cmdlet 创建架构。New-BqSchema 可以直接将行的格式作为参数或作为行描述的 JSON 数组。New-BqSchema 的结果总是传递到可以输出 Schema 对象或将架构分配给现有 TableSet-BqSchema

# 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 cmdlet 访问这些行。此外,还可使用 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 类型:查询、加载、提取和复制。查询作业运行 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 标志屏蔽此 cmdlet。Receive-BqJob 将在查询作业完成后返回结果。Get-BqJob 将返回一个引用对象,详细说明作业的当前状态和统计信息。Stop-BqJob 将向服务器发送请求以停止某个作业,然后立即返回。

关于查询字符串中表名称格式设置的注意事项:BigQuery 格式指定表名应该使用反引号,但反引号也是 PowerShell 的转义运算符。因此,必须通过添加第二个反引号来对该反引号进行转义。如需查看示例,请参阅“查询”作业示例代码。