1. 概要
BigQuery は、Google が提供するペタバイト規模の低料金フルマネージド分析データ ウェアハウスです。BigQuery は NoOps です。インフラストラクチャの管理もデータベース管理者も不要です。そのため、ユーザーは有用な情報を得るためのデータ分析に専念できます。また、使い慣れた SQL を使用し、従量課金制モデルも活用できます。
この Codelab では、Python 用 Google Cloud クライアント ライブラリを使用して、Python で BigQuery の一般公開データセットに対してクエリを実行します。
学習内容
- Cloud Shell の使い方
- BigQuery API を有効にする方法
- API リクエストを認証する方法
- Python クライアント ライブラリをインストールする方法
- シェイクスピア作品をクエリする方法
- GitHub データセットに対してクエリを実行する方法
- キャッシュを調整して統計情報を表示する方法
必要なもの
アンケート
このチュートリアルをどのように使用されますか?
Python のご利用経験はどの程度ありますか?
Google Cloud サービスの使用経験はどの程度ありますか?
<ph type="x-smartling-placeholder">2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。
- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列で、いつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud Console により一意の文字列が自動生成されます(通常は内容を意識する必要はありません)。ほとんどの Codelab では、プロジェクト ID を参照する必要があります(通常、プロジェクト ID は「
PROJECT_ID
」の形式です)。好みの文字列でない場合は、別のランダムな ID を生成するか、独自の ID を試用して利用可能であるかどうかを確認することができます。プロジェクトの作成後、ID は「フリーズ」されます。 - 3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud Console で課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルを終了した後に課金が発生しないようにリソースをシャットダウンするには、Codelab の最後にある「クリーンアップ」の手順を行います。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell の起動
Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。
Cloud Shell をアクティブにする
- Cloud Console で、[Cloud Shell をアクティブにする] をクリックします。
Cloud Shell を初めて起動する場合は、その内容を説明する中間画面(スクロールしなければ見えない範囲)が表示されます。その場合は、[続行] をクリックします(今後表示されなくなります)。この中間画面は次のようになります。
Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。
この仮想マシンには、必要な開発ツールがすべて含まれています。仮想マシンは Google Cloud で稼働し、永続的なホーム ディレクトリが 5 GB 用意されているため、ネットワークのパフォーマンスと認証が大幅に向上しています。このコードラボでの作業のほとんどは、ブラウザまたは Chromebook から実行できます。
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. API を有効にする
BigQuery API は、すべての Google Cloud プロジェクトでデフォルトで有効にする必要があります。これに該当するかどうかは、Cloud Shell で次のコマンドで確認できます。BigQuery が表示されているはずです。
gcloud services list
次のように BigQuery が表示されます。
NAME TITLE bigquery.googleapis.com BigQuery API ...
BigQuery API が有効になっていない場合は、Cloud Shell で次のコマンドを使用して有効にできます。
gcloud services enable bigquery.googleapis.com
4. API リクエストを認証する
BigQuery API にリクエストを送信するには、サービス アカウントを使用する必要があります。サービス アカウントはプロジェクトに属し、Google Cloud Python クライアント ライブラリで BigQuery API リクエストを行うために使用されます。ほかのユーザー アカウントと同じように、サービス アカウントはメールアドレスで表されます。このセクションでは、Cloud SDK を使用してサービス アカウントを作成し、サービス アカウントとして認証するために必要な認証情報を作成します。
まず、PROJECT_ID
環境変数を設定します。
export PROJECT_ID=$(gcloud config get-value core/project)
次に、次のコマンドを使用して、BigQuery API にアクセスするための新しいサービス アカウントを作成します。
gcloud iam service-accounts create my-bigquery-sa \ --display-name "my bigquery service account"
次に、Python コードが新しいサービス アカウントとしてログインするために使用する認証情報を作成します。次のコマンドを使用して認証情報を作成し、JSON ファイル ~/key.json
として保存します。
gcloud iam service-accounts keys create ~/key.json \ --iam-account my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com
最後に、GOOGLE_APPLICATION_CREDENTIALS
環境変数を設定します。この変数は、次のステップで説明する BigQuery Python クライアント ライブラリで使用されます。環境変数には、作成した認証情報を保存した JSON ファイルのフルパスを設定する必要があります。
export GOOGLE_APPLICATION_CREDENTIALS=~/key.json
詳細については、BigQuery API の認証をご覧ください。
5. アクセス制御を設定する
BigQuery は Identity and Access Management(IAM)を使用してリソースへのアクセスを管理します。BigQuery にはいくつかの事前定義ロール(user、dataOwner、dataViewer など)があり、前のステップで作成したサービス アカウントに割り当てることができます。アクセス制御の詳細については、BigQuery のドキュメントをご覧ください。
一般公開データセットに対してクエリを実行する前に、サービス アカウントに少なくとも roles/bigquery.user
ロールがあることを確認する必要があります。Cloud Shell で次のコマンドを実行して、サービス アカウントにユーザーロールを割り当てます。
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member "serviceAccount:my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com" \ --role "roles/bigquery.user"
次のコマンドを実行して、サービス アカウントにユーザーロールがあることを確認できます。
gcloud projects get-iam-policy $PROJECT_ID
次の結果が表示されます。
bindings: - members: - serviceAccount:my-bigquery-sa@<PROJECT_ID>.iam.gserviceaccount.com role: roles/bigquery.user ...
6. クライアント ライブラリをインストールする
BigQuery Python クライアント ライブラリをインストールします。
pip3 install --user --upgrade google-cloud-bigquery
これで、BigQuery API を使用してコーディングする準備が整いました。
7. シェイクスピアの作品をクエリする
一般公開データセットは、BigQuery に保存され、一般に公開されるデータセットです。クエリに使用できる一般公開データセットは他にも多数あります。一部のデータセットは Google によってホストされていますが、ほとんどはサードパーティによってホストされています。詳しくは、公開データセットのページをご覧ください。
BigQuery では、一般公開データセットに加えて、クエリに使用できるサンプル テーブルが限られています。これらのテーブルは bigquery-public-data:samples
データセットに含まれています。samples
データセットの shakespeare
テーブルには、シェイクスピア作品の単語インデックスが含まれています。これは、各コーパスで各単語が出現する回数を示します。
このステップでは、shakespeare
テーブルに対してクエリを実行します。
まず、Cloud Shell で、Translation API サンプルの実行に使用する簡単な Python アプリケーションを作成します。
mkdir bigquery-demo cd bigquery-demo touch app.py
Cloud Shell の右上からコードエディタを開きます。
bigquery-demo
フォルダ内の app.py
ファイルに移動し、コードを次のコードに置き換えます。
from google.cloud import bigquery
client = bigquery.Client()
query = """
SELECT corpus AS title, COUNT(word) AS unique_words
FROM `bigquery-public-data.samples.shakespeare`
GROUP BY title
ORDER BY unique_words
DESC LIMIT 10
"""
results = client.query(query)
for row in results:
title = row['title']
unique_words = row['unique_words']
print(f'{title:<20} | {unique_words}')
1 ~ 2 分ほどかけてコードを読み、テーブルに対してどのようにクエリが実行されるかを確認します。
Cloud Shell に戻り、アプリを実行します。
python3 app.py
単語とその出現箇所のリストが表示されます。
hamlet | 5318 kinghenryv | 5104 cymbeline | 4875 troilusandcressida | 4795 kinglear | 4784 kingrichardiii | 4713 2kinghenryvi | 4683 coriolanus | 4653 2kinghenryiv | 4605 antonyandcleopatra | 4582
8. GitHub データセットに対してクエリを実行する
BigQuery に慣れるため、GitHub の一般公開データセットに対してクエリを発行します。最も一般的なコミット メッセージは GitHub で確認できます。また、BigQuery のウェブ コンソールを使用して、アドホック クエリをプレビューし、実行します。
データの内容を確認するには、BigQuery ウェブ UI で GitHub データセットを開きます。
[プレビュー] ボタンをクリックすると、データがどのように表示されるか確認できます。
bigquery_demo
フォルダ内の app.py
ファイルに移動し、コードを次のコードに置き換えます。
from google.cloud import bigquery
client = bigquery.Client()
query = """
SELECT subject AS subject, COUNT(*) AS num_duplicates
FROM bigquery-public-data.github_repos.commits
GROUP BY subject
ORDER BY num_duplicates
DESC LIMIT 10
"""
results = client.query(query)
for row in results:
subject = row['subject']
num_duplicates = row['num_duplicates']
print(f'{subject:<20} | {num_duplicates:>9,}')
1 ~ 2 分かけてコードを学習し、最も一般的な commit メッセージがテーブルに対してどのように実行されるかを確認します。
Cloud Shell に戻り、アプリを実行します。
python3 app.py
commit メッセージとその発生回数のリストが表示されます。
Update README.md | 1,685,515 Initial commit | 1,577,543 update | 211,017 | 155,280 Create README.md | 153,711 Add files via upload | 152,354 initial commit | 145,224 first commit | 110,314 Update index.html | 91,893 Update README | 88,862
9. キャッシュと統計情報
BigQuery はクエリの結果をキャッシュに保存します。その結果、後続のクエリの所要時間が短縮されます。クエリ オプションを使用してキャッシュを無効にできます。BigQuery では、作成時間、終了時間、処理された合計バイト数など、クエリに関する統計情報も追跡されます。
このステップでは、キャッシュを無効にし、クエリに関する統計情報も表示します。
bigquery_demo
フォルダ内の app.py
ファイルに移動し、コードを次のコードに置き換えます。
from google.cloud import bigquery
client = bigquery.Client()
query = """
SELECT subject AS subject, COUNT(*) AS num_duplicates
FROM bigquery-public-data.github_repos.commits
GROUP BY subject
ORDER BY num_duplicates
DESC LIMIT 10
"""
job_config = bigquery.job.QueryJobConfig(use_query_cache=False)
results = client.query(query, job_config=job_config)
for row in results:
subject = row['subject']
num_duplicates = row['num_duplicates']
print(f'{subject:<20} | {num_duplicates:>9,}')
print('-'*60)
print(f'Created: {results.created}')
print(f'Ended: {results.ended}')
print(f'Bytes: {results.total_bytes_processed:,}')
コードについて、いくつか注意点があります。まず、QueryJobConfig
を導入し、use_query_cache
を false に設定することで、キャッシュを無効にします。次に、ジョブ オブジェクトからクエリに関する統計情報にアクセスしました。
Cloud Shell に戻り、アプリを実行します。
python3 app.py
前と同様に、commit メッセージとその発生回数のリストが表示されます。さらに、最後にクエリに関するいくつかの統計情報が表示されるはずです。
Update README.md | 1,685,515 Initial commit | 1,577,543 update | 211,017 | 155,280 Create README.md | 153,711 Add files via upload | 152,354 initial commit | 145,224 first commit | 110,314 Update index.html | 91,893 Update README | 88,862 ------------------------------------------------------------ Created: 2020-04-03 13:30:08.801000+00:00 Ended: 2020-04-03 13:30:15.334000+00:00 Bytes: 2,868,251,894
10. BigQuery へのデータの読み込み
独自のデータに対してクエリを実行する場合は、データを BigQuery に読み込む必要があります。BigQuery では、Cloud Storage、その他の Google サービス、その他の読み取り可能なソースなど、さまざまなソースからのデータの読み込みがサポートされています。ストリーミング挿入を使用してデータをストリーミングすることもできます。詳細については、BigQuery へのデータの読み込みのページをご覧ください。
このステップでは、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 .
米国の州のリストが含まれており、各州が 1 行に 1 つずつ JSON ドキュメントになっています。
head us-states.json
{"name": "Alabama", "post_abbr": "AL"} {"name": "Alaska", "post_abbr": "AK"} ...
この JSON ファイルを BigQuery に読み込むには、bigquery_demo
フォルダ内の app.py
ファイルに移動し、コードを次のように置き換えます。
from google.cloud import bigquery
client = bigquery.Client()
gcs_uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json'
dataset = client.create_dataset('us_states_dataset')
table = dataset.table('us_states_table')
job_config = bigquery.job.LoadJobConfig()
job_config.schema = [
bigquery.SchemaField('name', 'STRING'),
bigquery.SchemaField('post_abbr', 'STRING'),
]
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON
load_job = client.load_table_from_uri(gcs_uri, table, job_config=job_config)
print('JSON file loaded to BigQuery')
2 分ほど時間を取って、このコードが JSON ファイルを読み込み、データセットの下にスキーマを使用してテーブルを作成する方法を学びましょう。
Cloud Shell に戻り、アプリを実行します。
python3 app.py
BigQuery にデータセットとテーブルが作成されます。
データセットが作成されたことを確認するには、BigQuery コンソールに移動します。新しいデータセットとテーブルが表示されます。表のプレビュータブに切り替えてデータを確認します。
11. 完了
Python で BigQuery を使用する方法を学びました。
クリーンアップ
このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにする手順は次のとおりです。
- Cloud コンソールで、[リソースの管理] ページに移動します。
- プロジェクト リストで、プロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
詳細
- Google BigQuery: https://cloud.google.com/bigquery/docs/
- Google Cloud 上の Python: https://cloud.google.com/python/
- Python 用の Cloud クライアント ライブラリ: https://googleapis.github.io/google-cloud-python/
ライセンス
この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。