C# での BigQuery の使用

C# での BigQuery の使用

この Codelab について

subject最終更新: 6月 26, 2023
account_circle作成者: Mete Atamel

1. 概要

BigQuery は、Google が提供するペタバイト規模の低料金フルマネージド分析データ ウェアハウスです。BigQuery は NoOps です。インフラストラクチャの管理もデータベース管理者も不要です。そのため、ユーザーは有用な情報を得るためのデータ分析に専念できます。また、使い慣れた SQL を使用し、従量課金制モデルも活用できます。

この Codelab では、.NET 用の Google Cloud クライアント ライブラリを使用して、C# で BigQuery の一般公開データセットに対してクエリを実行します。

学習内容

  • Cloud Shell を使用する方法
  • BigQuery API を有効にする方法
  • API リクエストを認証する方法
  • C# 用 Google Cloud クライアント ライブラリをインストールする方法
  • シェイクスピア作品をクエリする方法
  • GitHub データセットに対してクエリを実行する方法
  • キャッシュを調整して統計情報を表示する方法

必要なもの

  • Google Cloud Platform プロジェクト
  • ChromeFirefox などのブラウザ
  • C# の使用経験

アンケート

<ph type="x-smartling-placeholder">をご覧ください。

このチュートリアルをどのように使用されますか?

C# の使用感をどのように評価されますか。

Google Cloud Platform サービスのご利用経験についてどのように評価されますか?

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell を起動する

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Cloud Shell をアクティブにする

  1. Cloud Console で、[Cloud Shell をアクティブにする] d1264ca30785e435.png をクリックします。

cb81e7c8e34bc8d.png

Cloud Shell を初めて起動する場合は、内容を説明する中間画面が表示されます。中間画面が表示されたら、[続行] をクリックします。

d95252b003979716.png

Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。

7833d5e1c5d18f54.png

この仮想マシンには、必要なすべての開発ツールが読み込まれます。5 GB の永続的なホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワークのパフォーマンスと認証が大幅に向上しています。この Codelab での作業のほとんどはブラウザを使って行うことができます。

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 を有効にする

BigQuery API は、すべての Google Cloud プロジェクトでデフォルトで有効にする必要があります。これに該当するかどうかは、Cloud Shell で次のコマンドで確認できます。BigQuery が表示されているはずです。

gcloud services list

次のように BigQuery が表示されます。

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

BigQuery API が有効になっていない場合は、Cloud Shell で次のコマンドを使用して有効にできます。

gcloud services enable bigquery-json.googleapis.com

4. C# 用の BigQuery クライアント ライブラリをインストールする

まず、BigQuery API サンプルの実行に使用するシンプルな C# コンソール アプリケーションを作成します。

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 に含まれています。そのうちの 1 つは shakespeare. です。シェイクスピア作品の単語インデックスが含まれ、各コーパスで各単語が出現する回数を指定します。

このステップでは、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"]}");
           
}
       
}
   
}
}

1 ~ 2 分ほどかけてコードを読み、テーブルに対してどのようにクエリが実行されるかを確認します。

Cloud Shell に戻り、アプリを実行します。

dotnet run

単語とその出現箇所のリストが表示されます。

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

6. GitHub データセットに対するクエリ

BigQuery に慣れるため、GitHub の一般公開データセットに対してクエリを発行します。最も一般的なコミット メッセージは GitHub で確認できます。また、BigQuery のウェブ コンソールを使用して、アドホック クエリをプレビューし、実行します。

データがどのように表示されるかを確認するには、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"]}");
           
}
       
}
   
}
}

1 ~ 2 分かけてコードを学習し、最も一般的な commit メッセージがテーブルに対してどのように実行されるかを確認します。

Cloud Shell に戻り、アプリを実行します。

dotnet run

commit メッセージとその発生回数のリストが表示されます。

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

前と同様に、commit メッセージとその発生回数のリストが表示されます。さらに、最後にクエリに関する統計データも表示されます。

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.

米国の州のリストが含まれており、各州が 1 行に 1 つずつ 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");
       
}
   
}
}

2 分ほど時間を取って、このコードが JSON ファイルを読み込み、データセットの下にスキーマを使用してテーブルを作成する方法を学びましょう。

Cloud Shell に戻り、アプリを実行します。

dotnet run

BigQuery にデータセットとテーブルが作成される

Json file loaded to BigQuery

データセットが実際に作成されていることを確認するには、BigQuery コンソールに移動します。新しいデータセットとテーブルが作成されているはずです。テーブルのプレビュー タブに切り替えると、実際のデータが表示されます。

7d9f7c493acbbf9a.png

9. お疲れさまでした

C# を使用して BigQuery を使用する方法を学びました。

クリーンアップ

このクイックスタートで使用するリソースに対して Google Cloud Platform アカウントに課金されないようにするには:

  • Cloud Platform コンソールに移動します。
  • シャットダウンするプロジェクトを選択し、[削除] をクリックしますプロジェクトの削除がスケジュールされます。

詳細

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。