Cloud Bigtable データのクエリ

このページでは、BigQuery を使用して、Cloud Bigtable に保存されたデータをクエリする方法について説明します。

Cloud Bigtable は Google の分散型 NoSQL データベースで、数十億行、数千列規模に拡張し、数ペタバイトのデータを格納できます。Cloud Bigtable のデータモデルは Apache HBase に類似しています。HBase 互換のクライアント ライブラリが用意されています。Cloud Bigtable データモデルの詳細については、ストレージ モデルをご覧ください。

は、

サポートされるリージョンとゾーン

現在、Cloud Bigtable のデータのクエリは、次のリージョンとゾーンでのみ利用できます。
地域 ゾーン
us-central1

us-central1-a

us-central1-b

us-central1-c

us-central1-f

europe-west1

europe-west1-b

europe-west1-c

europe-west1-d

Cloud Bigtable URI の取得

Cloud Bigtable データソース用の外部テーブルを作成するには、Cloud Bigtable URI を指定する必要があります。Cloud Bigtable URI を取得する手順は次のとおりです。

  1. Cloud Bigtable のコンソールを開きます。

    Cloud Bigtable のコンソールを開く

  2. Cloud Bigtable データソースについて次の詳細を取得します。

    • プロジェクト ID
    • Cloud Bigtable インスタンス ID
    • Cloud Bigtable テーブルの名前
  3. 次の形式で Cloud Bigtable URI を作成します。

    • [PROJECT_ID] は Cloud Bigtable インスタンスを含むプロジェクトです。
    • [INSTANCE_ID] は Bigtable インスタンス ID です。
    • [TABLE_NAME] はクエリ対象のテーブルの名前です。

    https://googleapis.com/bigtable/projects/[PROJECT_ID]/instances/[INSTANCE_ID]/tables/[TABLE_NAME]

アクセス制御とスコープ

外部の永続テーブルに対するアクセス制御

Google Cloud Bigtable データソースにリンクされた外部の永続テーブルへのアクセスを共有できます。外部の一時テーブルに対するアクセスは共有できません。

外部の永続テーブルに対するアクセスを、ユーザー(サービス アカウントを含む)またはグループと共有できます。外部テーブルをクエリするには、ユーザーまたはグループに少なくとも次の権限が必要です。

  • 外部テーブルを含むデータセットに対する READER または bigquery.dataViewer アクセス権
  • データセットを含むプロジェクトに対する bigquery.user アクセス権(クエリジョブの実行用)
  • Cloud Bigtable に対する bigtable.reader アクセス権。これはメタデータとテーブルに対する読み取り専用アクセスを許可します。

Compute Engine インスタンスのスコープ

Compute Engine インスタンスを作成するときに、インスタンスに対するスコープのリストを指定できます。このスコープは、Cloud Bigtable を含めて、Google Cloud Platform プロダクトに対するインスタンスのアクセスを制御します。VM 上で実行されるアプリケーションは、サービス アカウントを使用して Google Cloud API を呼び出します。

サービス アカウントとして実行するように Compute Engine インスタンスをセットアップした場合、Cloud Bigtable データソースにリンクされた外部テーブルにこのサービス アカウントからアクセスするならば、Cloud Bigtable 読み取り専用データアクセス スコープ(https://www.googleapis.com/auth/bigtable.data.readonly)をインスタンスに追加する必要があります。詳細については、Cloud Bigtable 用の Compute Engine インスタンスの作成をご覧ください。

Compute Engine インスタンスへのスコープの適用方法については、インスタンスのサービス アカウントとアクセス スコープの変更をご覧ください。Compute Engine サービス アカウントの詳細については、サービス アカウントをご覧ください。

外部の永続テーブルと一時テーブル

永続テーブルまたは一時テーブルを使用すると、BigQuery で外部のデータソースに対してクエリを行うことができます。永続テーブルを使用する場合には、BigQuery データセット内に、外部データソースにリンクされるテーブルを作成します。テーブルが永続的であるため、データセット レベルでアクセス制御を行い、基礎となる外部データソースにアクセスできる他のユーザーとテーブルを共有できます。テーブルに対するクエリはいつでも実行できます。

一時テーブルを使用して外部データソースに対してクエリを実行する場合には、クエリを含むコマンドを送信し、外部データソースにリンクする一時テーブルを作成します。一時テーブルを使用する場合、BigQuery データセット内にテーブルを作成しません。テーブルはデータセットに永続的に保存されないため、このテーブルを他のユーザーと共有することはできません。一時テーブルを使用して外部データに対して 1 回限りのアドホック クエリを実行する場合、あるいは抽出、変換、読み込み(ETL)プロセスを行う場合、外部データソースに対してクエリを実行すると便利です。

外部の永続テーブルを使用して Cloud Bigtable データに対してクエリを実行する

永続テーブルを使用して Cloud Bigtable のデータソースに対してクエリを実行するには、Cloud Bigtable データソースにリンクするテーブルを BigQuery データセットに作成します。データは BigQuery テーブルに保存されません。テーブルが永続的であるため、データセット レベルでアクセス制御を行い、基礎となる Cloud Bigtable データソースにアクセスできる他のユーザーとテーブルを共有できます。

Cloud Bigtable データソースにリンクされる外部の永続テーブルを BigQuery で作成する場合、テーブルのスキーマの指定方法は 2 つあります。

  • API または CLI を使用する場合には、外部データソースのスキーマとメタデータを定義するテーブル定義ファイルを作成します。
  • GCP Console または従来の BigQuery ウェブ UI を使用する場合には、Cloud Bigtable 列ファミリーと修飾子を手動で入力します。

外部の永続テーブルを使用して Cloud Bigtable データをクエリするには、次の操作を行います。

  • テーブル定義ファイルを作成する(CLI または API の場合)
  • BigQuery に外部データソースにリンクするテーブルを作成する
  • 永続テーブルを使用してデータに対してクエリを実行する

外部の永続テーブルを作成してクエリを実行する

永続テーブルを作成してクエリを実行するには:

従来の UI

  1. BigQuery ウェブ UI に移動します。
    BigQuery ウェブ UI に移動

  2. ナビゲーション パネルで、データセットにカーソルを合わせて下矢印アイコン 下矢印アイコン画像 をクリックし、[Create new table] をクリックします。

  3. [Create Table] ページの [Source Data] セクションで、次の操作を行います。

    • [Location] で [Google Cloud Bigtable] を選択し、ソース フィールドに次の形式で Cloud Bigtable URI を入力します。 https://googleapis.com/bigtable/projects/[PROJECT_ID]/instances/[INSTANCE_ID]/tables/[TABLE_NAME][PROJECT_ID] は Cloud Bigtable インスタンスを含むプロジェクトです。[INSTANCE_ID] は Cloud Bigtable インスタンス ID です。[TABLE_NAME] はクエリ対象のテーブルの名前です。
    • [File format] で、Cloud Bigtable が選択されていることを確認します。
  4. [Create Table] ページの [Destination Table] セクションで、次の操作を行います。

    • [Table name] で、該当するデータセットを選択します。テーブル名のフィールドに、BigQuery で作成する永続テーブルの名前を入力します。
    • [Table type] が [External table] に設定されていることを確認します。
  5. [Column Family and Qualifiers] ボックスで、[Add Family] を使用して列ファミリーと修飾子を指定するか、[Edit as text] をクリックして列ファミリーと修飾子の JSON 配列を入力します。このリストにより、クエリで参照可能な列ファミリーが制限され、値の型が指定されます。次に例を示します。

      [
        {
          "familyId": "family_int",
          "type": "INTEGER",
          "encoding": "BINARY",
          "onlyReadLatest": "true",
          "columns": [
            {
              "qualifierString": "foo",
              "onlyReadLatest": "true"
            }
          ]
        }
      ]
    
    列修飾子リストを使用して、型変換を行うことができます。このリストを空のままにした場合、すべての列ファミリーがテーブル スキーマに追加され、それらの値が BYTES として読み取られます。詳細については externalDataConfiguration API ドキュメントの Cloud Bigtable オプションの説明をご覧ください。

  6. [Options] セクションで項目を選択して、[Create Table] をクリックします。

永続テーブルが作成されると、ネイティブの BigQuery テーブルの場合と同じようにクエリを実行できます。ただし、外部データソースの制限の影響を受けます。ウェブ UI でテーブルにクエリを実行するには、[COMPOSE QUERY] をクリックし、[New Query] ボックスにクエリを入力して [RUN QUERY] をクリックします。

クエリの完了後に、結果を CSV または JSON としてエクスポートしたり、テーブルとして保存したり、Google スプレッドシートに保存することができます。詳しくは、データのダウンロード、保存、エクスポートをご覧ください。

CLI

BigQuery コマンドライン ツールでテーブルを作成するには、bq mk コマンドを使用します。外部データソースにリンクされるテーブルを CLI で作成するときには、テーブル定義ファイルを使用してテーブルのスキーマを指定します。

  1. bq mk コマンドで永続テーブルを作成します。

    bq mk --external_table_definition=[DEFINITION_FILE] [DATASET].[TABLE_NAME]
    

    ここで

    • [DEFINITION_FILE] は、ローカルマシン上のテーブル定義ファイルのパスです。
    • [DATASET] はテーブルを含むデータセットの名前です。
    • [TABLE_NAME] は作成するテーブルの名前です。

    これで、ネイティブ BigQuery テーブルの場合と同じようにテーブルに対してクエリを実行できます。ただし、外部データソースの制限の影響を受けます。

API

外部の一時テーブルを使用して Cloud Bigtable データに対してクエリを実行する

永続テーブルを作成せずに外部データソースに対してクエリを実行するには、次のものを結合するコマンドを実行します。

テーブル定義ファイルまたは指定したスキーマが使用され、外部の一時テーブルが作成され、このテーブルに対してクエリが実行されます。一時テーブルを使用して外部データソースに対してクエリを実行する場合、BigQuery CLI または API を使用します。

外部の一時テーブルを使用する場合は、BigQuery データセット内にテーブルが作成されません。テーブルはデータセットに永続的に保存されないので、このテーブルを他のユーザーと共有できません。外部データに対する 1 回限りのアドホック クエリを行う場合、または抽出、変換、読み込み(ETL)プロセスを行う場合は、一時テーブルを使用して外部データソースをクエリすると便利です。

外部の一時テーブルを作成してクエリを実行する

外部の一時テーブルを使用して Cloud Bigtable データに対してクエリを実行するには、次の操作を行います。

現在、外部の一時テーブルを作成してクエリを実行する操作は CLI と API でサポートされています。

CLI

テーブル定義ファイルを使用して一時テーブルに対してクエリを実行するには、次のコマンドを入力します。

bq --location=[LOCATION] query --use_legacy_sql=false --external_table_definition=[TABLE_NAME]::[DEFINITION_FILE] '[QUERY]'

ここで

  • [LOCATION]ロケーションの名前です。データが US または EU のマルチリージョン ロケーションにある場合は、--location フラグを省略できます。
  • [TABLE_NAME] は、作成する一時テーブルの名前です。
  • [DEFINITION_FILE] は、ローカルマシン上のテーブル定義ファイルのパスです。
  • [QUERY] は、一時テーブルに送信するクエリです。

次のコマンドは、follows_def という名前のテーブル定義ファイルを使用して follows という名前の一時テーブルを作成して、クエリを実行します。

bq --location=US query --use_legacy_sql=false --external_table_definition=follows::/tmp/follows_def 'SELECT COUNT(rowkey) FROM follows;'

API

パフォーマンスに関する注意事項

Cloud Bigtable 外部データソースに対するクエリのパフォーマンスは、次の 3 つの要因によって変わります。

  • 行数
  • 読み取るデータの量
  • 同時読み込みの範囲

BigQuery は、データの読み取り量をできる限り少なくする目的で、クエリで参照される列ファミリーだけを読み取ります。Cloud Bigtable クラスタに存在するノード数やテーブルの分割数によって、同時読み込みの範囲が変わります。

Cloud Bigtable は、負荷に応じて分割を自動的に統合します。テーブルの読み取り頻度が少ない場合、分割数も少なくなり、クエリのパフォーマンスは徐々に低下します。行キーでテーブルを分割する方法については、テーブルの管理をご覧ください。

BigQuery から Cloud Bigtable に対してクエリを実行すると、Cloud Bigtable の CPU サイクルが消費されます。BigQuery による CPU の消費は、ユーザー トラフィックのライブ送信など、他の同時リクエストのレイテンシとスループットに影響を及ぼす可能性があります。たとえば、Cloud Bigtable の CPU 使用率が高くなると、ロングテール クエリに影響を及ぼし、レイテンシが 99 パーセンタイルに上昇します。

Cloud Bigtable CPU の使用率をモニタリングし、GCP Console の Cloud Bigtable モニタリング ダッシュボードに示される推奨範囲内にあることを確認してください。インスタンスのノード数を増やすと、BigQuery トラフィックと他の同時リクエストのトラフィックが適切に処理されます。

生成されたスキーマ

デフォルトで、BigQuery は列ファミリー内の値を列の配列として公開します。その中で、値の配列が異なるタイムスタンプで書き込まれます。このスキーマにより、Cloud Bigtable でデータ固有のレイアウトが維持されますが、SQL クエリでは操作が難しくなる場合があります。親の列ファミリー内で列がサブフィールドになる場合や、各セルから最新の値だけが読み取られる場合があります。デフォルト スキーマでは、両方の配列がスカラー値として扱われます。

架空のソーシャル ネットワークにユーザー プロフィールを保存しています。このデータモデルは profile 列ファミリーで、genderageemail という個別の列が存在します。

rowkey | profile:gender| profile:age| profile:email
-------| --------------| -----------| -------------
alice  | female        | 30         | alice@gmail.com

デフォルトのスキーマを使用する場合、30 歳を超える男性ユーザー数を確認する標準 SQL クエリは次のようになります。

SELECT COUNT(1) FROM `[DATASET].[TABLE_NAME]`
OMIT RECORD IF NOT SOME(profile.column.name = "gender" AND profile.column.cell.value = "male")
OR NOT SOME(profile.column.name = "age" AND INTEGER(profile.column.cell.value) > 30);

genderage がサブフィールドとして公開されていれば、クエリはそれほど難しいものではありません。これらをサブフィールドとして公開するには、テーブルを定義するときに、profile 列ファミリーで genderage を名前付きの列として設定します。また、この列ファミリーから最新の値を公開するように BigQuery に指示することもできます。通常は、最新の値(唯一の値)だけが処理の対象となります。

列をサブフィールドとして公開すると、30 歳を超える男性ユーザー数を確認する標準 SQL クエリは次のようになります。

SELECT COUNT(1) FROM `[DATASET].[TABLE_NAME]`
WHERE profile.gender.cell.value="male" AND profile.age.cell.value > 30;

genderage はフィールドとして直接参照されています。この設定の JSON 構成は次のとおりです。

      "bigtableOptions": {
        "readRowkeyAsString": "true",
        "columnFamilies": [
          {
              "familyId": "profile",
              "onlyReadLatest": "true",
              "columns": [
                  {
                      "qualifierString": "gender",
                      "type": "STRING"
                  },
                  {
                      "qualifierString": "age",
                      "type": "INTEGER"
                  }
              ]
          }
        ]
      }
    

値のエンコード

Cloud Bigtable はデータを RAW バイトとして保存し、データのエンコードに依存しません。ただし、SQL クエリ分析でバイト値を使用する場合に制限があります。Cloud Bigtable には、2 種類の基本的なスカラー デコード(テキストと HBase バイナリ)があります。

テキスト形式は、すべての値が英数字のテキスト文字列で保存されていることを前提としています。たとえば、整数 768 は文字列 "768" として保存されます。バイナリ エンコードでは、HBase の Bytes.toBytes メソッドクラスを使ってデータがエンコードされたことを想定し、適切なデコード方法を適用します。

クエリフィルタ

行のクエリは、特定の行のみを読み込むフィルタと同じ機能になります。たとえば、次の標準 SQL 構文では、

SELECT COUNT(follows.column.name) FROM `[DATASET].[TABLE_NAME]` WHERE rowkey = "alice";

rowkey > '1'rowkey < '8' などの範囲フィルタも使用できます。ただし、使用できるのは、readRowkeyAsString オプションで rowkey が文字列として読み取られる場合に限ります。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。