BigQuery を使用して Bigtable データをクエリおよび分析する
BigQuery は、SQL クエリを使用した Bigtable データのクエリと分析に役立つマネージド データ ウェアハウスです。BigQuery は、データ アナリスト、データ エンジニア、データ サイエンティストなどが、Bigtable データを使用してビジネス上の疑問の答えを見つけるために役立ちます。
BigQuery では、BigQuery から Bigtable データをクエリできます。この機能は、Bigtable データを BigQuery テーブルに結合する場合に便利です。
このドキュメントでは、BigQuery を使用して Bigtable データをクエリする方法の概要について説明します。このページを読む前に、Bigtable の概要と BigQuery の概要を理解する必要があります。
BigQuery を使用して Bigtable テーブルにクエリを実行するのは、すべての行に同じ列ファミリーと列修飾子があるテーブルに最適です。
外部テーブルの作成
Bigtable データに対してクエリを実行する前に、ユーザーまたは組織内の管理者は、外部テーブルを作成する必要があります。外部テーブルとは、Bigtable へのメタデータ ポインタを含む BigQuery テーブルで、クエリの送信先となります。外部テーブルの詳細については、外部データソースの概要をご覧ください。
外部テーブルは、Bigtable テーブルと同じリージョンに作成する必要があります。たとえば、テーブルが europe-central2-a
(ワルシャワ)、europe-west1-c
(ベルギー)、asia-east1-a
(東京)にクラスタがあるインスタンスにある場合、外部テーブルはワルシャワ、ベルギー、東京のいずれかに作成する必要があります。
ほとんどの場合、外部テーブルを作成する場合は、readRowkeyAsString
と ignoreUnspecifiedColumnFamilies
を true に設定します。
ignoreUnspecifiedColumnFamilies
が true の場合、列ファミリーの一部の列のみを含むテーブル定義を作成するときに、選択した列のみが外部テーブルの列として昇格されます。選択されていない列のデータは、一般的な column
列にグループ化されます。
外部テーブルを作成するには、Bigtable 外部テーブルを作成するの手順に沿って操作します。
外部テーブルのデータをクエリする
Bigtable テーブルの外部テーブルを作成したら、次のいずれかの方法で SQL クエリをそのテーブルに送信できます。
- コマンドラインで
bq
、BigQuery CLI を使用します。 - BigQuery API の呼び出し
- BigQuery クライアント ライブラリ
クエリを作成して実行する方法については、クエリを実行するをご覧ください。必要な権限とコードサンプルなど、Bigtable 固有の手順については、Bigtable データにクエリを実行するをご覧ください。
スケジュールされたクエリ
スケジュールされたクエリは、Bigtable データを BigQuery に定期的にインポートする場合に便利です。また、データ パイプラインを構築してデータを BigQuery にストリーミングする必要があるユースケースにも役立ちます。スケジュールされたクエリを管理する手順については、クエリのスケジューリングをご覧ください。
テーブルのフルスキャンを回避する
Bigtable テーブルに直接読み取りリクエストを送信する場合と同様に、外部テーブルにテーブルをクエリするとき、通常はテーブル全体のスキャンを回避したいと考えます。テーブルのフルスキャンでは CPU 使用率が増加し、選択的なクエリよりもかなり時間がかかります。また、BigQuery のスループットの向上も必要とされます。
クエリにすべての行が関係する場合は、テーブルのフルスキャンがトリガーされます。一方、クエリを制限して行の範囲または指定された非連続行をリクエストした場合、テーブル全体のスキャンができません。GoogleSQL 構文でクエリを制限する例を次に示します。
WHERE rowkey = "abc123"
WHERE rowkey BETWEEN "abc123" PRECEDING AND "abc999" FOLLOWING
WHERE rowkey > 999999
(行キーを文字列として読み取る場合)
結合
結合を使用して Bigtable テーブルデータを他のソースのデータと組み合わせて分析する場合は、結合する Bigtable から関連するフィールドを抽出するサブクエリを作成する必要があります。テーブルの結合に関するその他のベスト プラクティスについては、クエリ計算を最適化するをご覧ください。
費用
外部テーブルを作成してクエリを実行すると、BigQuery の料金と、トラフィックの処理に必要な Bigtable ノードの増加に対して料金が発生します。外部テーブルは Bigtable テーブルと同じリージョンにあるため、ネットワーク費用は発生しません。
通常の営業時間中にクエリを実行する場合は、Bigtable 自動スケーリングを有効にして、必要に応じてノードの数を増やし、ジョブの完了時にノードの数を減らすことを検討してください。厳密な期限がないスケジュール設定されたクエリを実行する場合にも、自動スケーリングは効果的な戦術です。
費用を抑えるもう 1 つの方法は、テーブル全体のスキャンを回避することです。
BigQuery の費用の最適化の詳細については、費用の見積もりと管理をご覧ください。
制限事項
次の制限が適用されます。
- BigQuery を使用して、JSON 形式で保存されている Bigtable データをクエリすることはできません。
- プロトコル バッファ(protobuf)や Avro 形式など、ネストされた型を持つシリアル化されたデータを含むクエリ結果は、正しくレンダリングされないか、Google Cloud コンソールで読み取るのが困難な場合があります。
次のステップ
- 外部テーブルと連携クエリの違いについて学ぶ。
- Bigtable の外部テーブルを作成する。
- 外部テーブルに保存されている Bigtable データをクエリする。
- BigQuery から Bigtable にデータをエクスポートする。
- Bigtable と BigQuery を使用してリアルタイム分析データベースを作成する