將 BigQuery 與 C# 搭配使用

將 BigQuery 與 C# 搭配使用

程式碼研究室簡介

subject上次更新時間:6月 26, 2023
account_circle作者:Mete Atamel

1. 總覽

BigQuery 是 Google 推出的 PB 規模全代管數據分析資料倉儲系統,由於 BigQuery 沒有基礎架構且不需管理,也不需要資料庫管理員,因此免人工管理。因此,您可以專心分析資料,找出有意義的結果、使用熟悉的 SQL,以及運用我們的即付即用模式。

在本程式碼研究室中,您將使用 .NET 適用的 Google Cloud 用戶端程式庫,使用 C# 查詢 BigQuery 公開資料集

課程內容

  • 如何使用 Cloud Shell
  • 如何啟用 BigQuery API
  • 如何驗證 API 要求
  • 如何安裝 C# 適用的 Google Cloud 用戶端程式庫
  • 如何查詢莎士比亞的作品
  • 如何查詢 GitHub 資料集
  • 如何調整快取及顯示統計資料

軟硬體需求

  • Google Cloud Platform 專案
  • 瀏覽器,例如 ChromeFirefox
  • 熟悉使用 C#

問卷調查

您會如何使用這個教學課程?

針對 C# 的使用體驗,您會給予什麼評價?

根據您使用 Google Cloud Platform 服務的經驗,您會給予什麼評價?

2. 設定和需求

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您可以隨時更新付款方式。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為 PROJECT_ID)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。或者,您也可以自行嘗試,看看是否支援。在這個步驟後,這個名稱即無法變更,而且在專案期間內仍會保持有效。
  • 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行本程式碼研究室不會產生任何費用 (如果有的話)。如要關閉資源,以免產生本教學課程結束後產生的費用,您可以刪除自己建立的資源或刪除專案。新使用者符合 $300 美元免費試用計畫的資格。

啟動 Cloud Shell

雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。

啟用 Cloud Shell

  1. 在 Cloud 控制台中,按一下「啟用 Cloud Shell」圖示 d1264ca30785e435.png

cb81e7c8e34bc8d.png

如果您是第一次啟動 Cloud Shell,系統會顯示中繼畫面,說明這項服務的內容。如果系統顯示中繼畫面,請按一下「繼續」

d95252b003979716.png

佈建並連線至 Cloud Shell 只需幾分鐘的時間。

7833d5e1c5d18f54.png

這個虛擬機器已載入所有必要的開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。在本程式碼研究室中,您的大部分作業都可透過瀏覽器完成。

連線至 Cloud Shell 後,您應會發現自己通過驗證,且專案已設為您的專案 ID。

  1. 在 Cloud Shell 中執行下列指令,確認您已通過驗證:
gcloud auth list

指令輸出

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. 在 Cloud Shell 中執行下列指令,確認 gcloud 指令知道您的專案:
gcloud config list project

指令輸出

[core]
project = <PROJECT_ID>

如果尚未設定,請使用下列指令進行設定:

gcloud config set project <PROJECT_ID>

指令輸出

Updated property [core/project].

3. 啟用 BigQuery API

根據預設,所有 Google Cloud 專案都應啟用 BigQuery API。您可以在 Cloud Shell 中使用下列指令來檢查結果是否屬實:系統應該會列出 BigQuery:

gcloud services list

畫面上應會列出 BigQuery:

NAME                              TITLE
bigquery
-json.googleapis.com      BigQuery API
...

如果未啟用 BigQuery API,您可以在 Cloud Shell 中執行下列指令來啟用 BigQuery API:

gcloud services enable bigquery-json.googleapis.com

4. 安裝 C# 適用的 BigQuery 用戶端程式庫

首先,請建立簡易的 C# 主控台應用程式,用於執行 BigQuery API 範例。

dotnet new console -n BigQueryDemo

您應該會看到應用程式已建立,並已解決依附元件:

The template "Console Application" was created successfully.
Processing post-creation actions...
...
Restore succeeded.

接著前往 BigQueryDemo 資料夾:

cd BigQueryDemo

然後將 Google.Cloud.BigQuery.V2 NuGet 套件新增至專案:

dotnet add package Google.Cloud.BigQuery.V2
info : Adding PackageReference for package 'Google.Cloud.BigQuery.V2' into project '/home/atameldev/BigQueryDemo/BigQueryDemo.csproj'.
log  
: Restoring packages for /home/atameldev/BigQueryDemo/BigQueryDemo.csproj...
...
info
: PackageReference for package 'Google.Cloud.BigQuery.V2' version '1.2.0' added to file '/home/atameldev/BigQueryDemo/BigQueryDemo.csproj'.

現在您已準備好使用 BigQuery API 了!

5. 查詢莎士比亞的作品

公開資料集是儲存在 BigQuery 中且可供一般大眾使用的任何資料集。還有許多其他公開資料集可供您查詢,其中有些也由 Google 代管,但許多則由第三方代管。詳情請參閱「公開資料集」頁面。

除了公開資料集,BigQuery 還提供一些範例資料表供您查詢。這些資料表包含在 bigquery-public-data:samples dataset 中。其中一個資料表的名稱是 shakespeare.。它內含莎士比亞作品的字詞索引,能夠提供每個字詞在各語料庫中出現的次數。

在這個步驟中,您將查詢莎士比亞資料表。

首先,開啟 Cloud Shell 右上角的程式碼編輯器:

fd3fc1303e63572.png

前往 BigQueryDemo 資料夾中的 Program.cs 檔案,然後將程式碼替換為以下程式碼。請務必將 projectId 替換成實際的專案 ID:

using System;
using Google.Cloud.BigQuery.V2;

namespace BigQueryDemo
{
   
class Program
   
{
       
static void Main(string[] args)
       
{
           
var client = BigQueryClient.Create("projectId");
           
var table = client.GetTable("bigquery-public-data", "samples", "shakespeare");
           
var sql = $"SELECT corpus AS title, COUNT(word) AS unique_words FROM {table} GROUP BY title ORDER BY unique_words DESC LIMIT 10";

           
var results = client.ExecuteQuery(sql, parameters: null);

           
foreach (var row in results)
           
{
               
Console.WriteLine($"{row["title"]}: {row["unique_words"]}");
           
}
       
}
   
}
}

請花一兩分鐘研究程式碼,看看資料表如何查詢。

返回 Cloud Shell,執行應用程式:

dotnet run

您應該會看到字詞及其發生情況的清單:

hamlet: 5318
kinghenryv
: 5104
cymbeline
: 4875
troilusandcressida
: 4795
kinglear
: 4784
kingrichardiii
: 4713
2kinghenryvi: 4683
...

6. 查詢 GitHub 資料集

為了進一步瞭解 BigQuery,現在請查詢 GitHub 公開資料集。您可以在 GitHub 找到最常見的修訂版本訊息。您也可以使用 BigQuery 的 Web 控制台預覽及執行臨時查詢。

若要查看資料的模樣,請在 BigQuery 網頁版 UI 中開啟 GitHub 資料集:

https://console.cloud.google.com/bigquery?p=bigquery-public-data&amp;d=github_repos&amp;t=commits&amp;page=table

如要快速預覽資料,請使用「預覽」按鈕:

f706bfe3dfcbd267.png

前往 BigQueryDemo 資料夾中的 Program.cs 檔案,然後將程式碼替換為以下程式碼。請務必將 projectId 替換成實際的專案 ID:

using System;
using Google.Cloud.BigQuery.V2;

namespace BigQueryDemo
{
   
class Program
   
{
       
static void Main(string[] args)
       
{
           
var client = BigQueryClient.Create("projectId");
           
var table = client.GetTable("bigquery-public-data", "github_repos", "commits");
           
           
var sql = $"SELECT subject AS subject, COUNT(*) AS num_duplicates FROM {table} GROUP BY subject ORDER BY num_duplicates DESC LIMIT 10";

           
var results = client.ExecuteQuery(sql, parameters: null);

           
foreach (var row in results)
           
{
               
Console.WriteLine($"{row["subject"]}: {row["num_duplicates"]}");
           
}
       
}
   
}
}

請花一兩分鐘研究程式碼,看看如何查詢最常見的修訂版本訊息。

返回 Cloud Shell,執行應用程式:

dotnet run

您應該會看到修訂訊息及其發生情況的清單:

Update README.md: 2509242
: 1971725
Initial commit: 1942149
Mirroring from Micro.blog.: 838586
update
: 575188
Update data.json: 548651
Update data.js: 548339
Add files via upload: 379941
*** empty log message ***: 358528
Can't you see I'm updating the time?: 286863

7. 快取與統計資料

初始查詢之後,BigQuery 會快取結果。因此後續查詢所需的時間也較短。您可以使用查詢選項停用快取功能。BigQuery 也會追蹤部分查詢的相關統計資料,例如建立時間、結束時間、已處理的位元組總數。

在這個步驟中,您將停用快取,並顯示查詢的相關統計資料。

前往 BigQueryDemo 資料夾中的 Program.cs 檔案,然後將程式碼替換為以下程式碼。請務必將 projectId 替換成實際的專案 ID:

using System;
using Google.Cloud.BigQuery.V2;

namespace BigQueryDemo
{
   
class Program
   
{
       
static void Main(string[] args)
       
{
           
var client = BigQueryClient.Create("projectId");
           
var table = client.GetTable("bigquery-public-data", "github_repos", "commits");
           
           
var sql = $"SELECT subject AS subject, COUNT(*) AS num_duplicates FROM {table} GROUP BY subject ORDER BY num_duplicates DESC LIMIT 10";
           
var queryOptions = new QueryOptions {
               
UseQueryCache = false
           
};

           
var results = client.ExecuteQuery(sql, parameters: null, queryOptions: queryOptions);

           
foreach (var row in results)
           
{
               
Console.WriteLine($"{row["subject"]}: {row["num_duplicates"]}");
           
}

           
var job = client.GetJob(results.JobReference);
           
var stats = job.Statistics;
           
Console.WriteLine("----------");
           
Console.WriteLine($"Creation time: {stats.CreationTime}");
           
Console.WriteLine($"End time: {stats.EndTime}");
           
Console.WriteLine($"Total bytes processed: {stats.TotalBytesProcessed}");
       
}
   
}
}

程式碼的幾個注意事項。首先,導入查詢選項並將 UseQueryCache 設為 false,即可停用快取。其次,您從工作物件存取了有關查詢的統計資料。

返回 Cloud Shell,執行應用程式:

dotnet run

和之前一樣,您應該會看到修訂訊息及其發生情況的清單。此外,您也應該會在表格底部看到與查詢相關的統計資料

Update README.md: 2509242
: 1971725
Initial commit: 1942149
Mirroring from Micro.blog.: 838586
update
: 575188
Update data.json: 548651
Update data.js: 548339
Add files via upload: 379941
*** empty log message ***: 358528
Can't you see I'm updating the time?: 286863
----------
Creation time: 1533052057398
End time: 1533052066961
Total bytes processed: 9944197093

8. 將資料載入 BigQuery

如要查詢自己的資料,就必須先將資料載入 BigQuery。BigQuery 支援從多種來源載入資料,例如 Google Cloud Storage、其他 Google 服務與可讀取的來源。您甚至可以使用串流插入功能來串流資料。詳情請參閱將資料載入 BigQuery 頁面。

在這個步驟中,您將將儲存在 Google Cloud Storage 中的 JSON 檔案載入 BigQuery 資料表。JSON 檔案位於 gs://cloud-samples-data/bigquery/us-states/us-states.json

如要進一步瞭解 JSON 檔案的內容,可以使用 gsutil 指令列工具,下載至 Cloud Shell 中:

gsutil cp gs://cloud-samples-data/bigquery/us-states/us-states.json .
Copying gs://cloud-samples-data/bigquery/us-states/us-states.json...
/ [1 files][  2.0 KiB/  2.0 KiB]                                                
Operation completed over 1 objects/2.0 KiB.

您可以看到,其中包含美國各州清單,且每個州都是 JSON 文件,分行顯示:

less us-states.json
{"name": "Alabama", "post_abbr": "AL"}
{"name": "Alaska", "post_abbr":  "AK"}
...

如要將這個 JSON 檔案載入 BigQuery,請前往 BigQueryDemo 資料夾中的 Program.cs 檔案,然後將程式碼替換為下列內容。請務必將 projectId 替換成實際的專案 ID:

using System;
using Google.Cloud.BigQuery.V2;

namespace BigQueryDemo
{
   
class Program
   
{
       
static void Main(string[] args)
       
{
           
var gcsUri = "gs://cloud-samples-data/bigquery/us-states/us-states.json";
           
var client = BigQueryClient.Create("projectId");
           
var dataset = client.GetOrCreateDataset("us_states_dataset");

           
var schema = new TableSchemaBuilder
           
{
               
{ "name", BigQueryDbType.String },
               
{ "post_abbr", BigQueryDbType.String }
           
}.Build();

           
var jobOptions = new CreateLoadJobOptions
           
{
               
SourceFormat = FileFormat.NewlineDelimitedJson
           
};

           
var table = dataset.GetTableReference("us_states_table");
           
var loadJob = client.CreateLoadJob(gcsUri, table, schema, jobOptions);

            loadJob
.PollUntilCompleted();
            loadJob
.ThrowOnAnyError();
           
Console.WriteLine("Json file loaded to BigQuery");
       
}
   
}
}

花幾分鐘時間研究程式碼如何載入 JSON 檔案,並在資料集內建立含有結構定義的資料表。

返回 Cloud Shell,執行應用程式:

dotnet run

在 BigQuery 中建立資料集和資料表

Json file loaded to BigQuery

如要確認資料集是否確實建立,請前往 BigQuery 控制台。您應該會看到新的資料集和已建立的資料表。只要切換至表格的預覽分頁,即可查看實際資料:

7d9f7c493acbbf9a.png

9. 恭喜!

您已學會如何透過 C# 使用 BigQuery!

清除所用資源

如何避免系統向您的 Google Cloud Platform 帳戶收取您在本快速入門導覽課程中所用資源的相關費用:

  • 前往 Cloud Platform 主控台
  • 選取您要關閉的專案,然後按一下「刪除」會安排將專案刪除。

瞭解詳情

授權

這項內容採用的是創用 CC 姓名標示 2.0 通用授權。