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
(東京)にクラスタがあるインスタンスにある場合、ワルシャワ、ベルギー、東京に外部テーブルを作成する必要があります。
推奨構成
外部テーブルを作成する場合は、次のベスト プラクティスをおすすめします。
アプリケーション サービスを提供するトラフィックに影響を与えないようにするには、BigQuery 外部テーブルを使用して Bigtable データを読み取る際に、Data Boost サーバーレス コンピューティングを使用します。Data Boost の使用は、アドホック クエリで特に費用対効果が高くなります。Data Boost を使用するには、外部テーブル定義の作成時に Data Boost アプリ プロファイルを指定します。Data Boost の詳細については、Bigtable Data Boost の概要をご覧ください。
ほとんどの場合、外部テーブルを作成する場合は、
readRowkeyAsString
とignoreUnspecifiedColumnFamilies
を true に設定します。ignoreUnspecifiedColumnFamilies
が true の場合、列ファミリーの一部の列のみを含むテーブル定義を作成すると、選択した列のみが外部テーブルの列として昇格されます。選択されていない列のデータは、一般的なcolumn
列にグループ化されます。
外部テーブルを作成するには、Bigtable 外部テーブルを作成するの手順に沿って操作します。
外部テーブルのデータをクエリする
Bigtable テーブルの外部テーブルを作成したら、次のいずれかの方法で SQL クエリをそのテーブルに送信できます。
- コマンドラインで
bq
、BigQuery CLI を使用します。 - BigQuery API の呼び出し
- BigQuery クライアント ライブラリ
クエリを作成して実行する方法については、クエリを実行するをご覧ください。必要な権限やコードサンプルなど、Bigtable 固有の手順については、Bigtable データにクエリを実行するをご覧ください。
スケジュールされたクエリ
スケジュールされたクエリは、Bigtable データを BigQuery に定期的にインポートする場合に便利です。また、データ パイプラインを構築してデータを BigQuery にストリーミングする必要があるユースケースにも役立ちます。スケジュールされたクエリの管理手順については、クエリのスケジュール設定をご覧ください。
テーブルのフルスキャン
Data Boost を使用してデータを読み取る場合、テーブル全体のスキャンを回避する必要はありません。ただし、コンピューティングにプロビジョニングされたノードを使用する場合は、テーブル全体のスキャンを回避する必要があります。Bigtable テーブルに直接読み取りリクエストを送信する場合と同様に、外部テーブルにテーブルをクエリするときに Data Boost を使用していない場合は、通常、テーブル全体のスキャンを回避する必要があります。テーブルのフルスキャンでは 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 の費用の最適化の詳細については、費用の見積もりと管理をご覧ください。
制限事項
次の制限が適用されます。
- プロトコル バッファ(protobuf)や Avro 形式など、ネストされた型を持つシリアル化されたデータを含むクエリ結果は、正しくレンダリングされないか、 Google Cloud コンソールで読み取るのが困難な場合があります。
次のステップ
- 外部テーブルと連携クエリの違いについて学ぶ。
- Bigtable の外部テーブルを作成する。
- 外部テーブルに保存されている Bigtable データをクエリする。
- BigQuery から Bigtable にデータをエクスポートする。
- Bigtable と BigQuery を使用してリアルタイム分析データベースを構築する