この Codelab について
1. 概要
BigQuery は、Google が提供するペタバイト規模の低料金フルマネージド分析データ ウェアハウスです。BigQuery は NoOps です。インフラストラクチャの管理もデータベース管理者も不要です。そのため、ユーザーは有用な情報を得るためのデータ分析に専念できます。また、使い慣れた SQL を使用し、従量課金制モデルも活用できます。
この Codelab では、.NET 用の Google Cloud クライアント ライブラリを使用して、C# で BigQuery の一般公開データセットに対してクエリを実行します。
学習内容
- Cloud Shell を使用する方法
- BigQuery API を有効にする方法
- API リクエストを認証する方法
- C# 用 Google Cloud クライアント ライブラリをインストールする方法
- シェイクスピア作品をクエリする方法
- GitHub データセットに対してクエリを実行する方法
- キャッシュを調整して統計情報を表示する方法
必要なもの
アンケート
このチュートリアルをどのように使用されますか?
C# の使用感をどのように評価されますか。
Google Cloud Platform サービスのご利用経験についてどのように評価されますか?
2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。
- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_ID
と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell を起動する
Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Cloud Shell をアクティブにする
- Cloud Console で、[Cloud Shell をアクティブにする]
をクリックします。
Cloud Shell を初めて起動する場合は、内容を説明する中間画面が表示されます。中間画面が表示されたら、[続行] をクリックします。
Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。
この仮想マシンには、必要なすべての開発ツールが読み込まれます。5 GB の永続的なホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワークのパフォーマンスと認証が大幅に向上しています。この Codelab での作業のほとんどはブラウザを使って行うことができます。
Cloud Shell に接続すると、認証が完了し、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。
- 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`
- 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 の右上からコードエディタを開きます。
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 データセットを開きます。
[プレビュー] ボタンを使用すると、データがどのように表示されるかを簡単に確認できます。
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 コンソールに移動します。新しいデータセットとテーブルが作成されているはずです。テーブルのプレビュー タブに切り替えると、実際のデータが表示されます。
9. お疲れさまでした
C# を使用して BigQuery を使用する方法を学びました。
クリーンアップ
このクイックスタートで使用するリソースに対して Google Cloud Platform アカウントに課金されないようにするには:
- Cloud Platform コンソールに移動します。
- シャットダウンするプロジェクトを選択し、[削除] をクリックしますプロジェクトの削除がスケジュールされます。
詳細
- Google BigQuery: https://cloud.google.com/bigquery/docs/
- Google Cloud Platform 上の C#/.NET: https://cloud.google.com/dotnet/
- Google Cloud .NET クライアント: https://googlecloudplatform.github.io/google-cloud-dotnet/
ライセンス
この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。