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

アクセス制御とスコープ

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

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

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

  • データセット レベル以上での bigquery.dataViewer 役割。これは外部テーブルを含むデータセットへのアクセスに必要です。
  • プロジェクト レベル以上での bigquery.user 役割。これはクエリジョブの実行に必要です。
  • Cloud Bigtable における bigtable.reader 役割。これはメタデータとテーブルに対する読み取り専用アクセスを許可します。

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

Compute Engine インスタンスを作成するときに、インスタンスに対するスコープのリストを指定できます。このスコープは、Cloud Bigtable を含めて、Google Cloud Platform プロダクトに対するインスタンスのアクセスを制御します。VM で実行されるアプリケーションは、サービス アカウントを使用して Google Cloud Platform 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 データセット内にはテーブルを作成しません。テーブルはデータセットに永続的に保存されないため、このテーブルを他のユーザーと共有することはできません。一時テーブルを使用して外部データに対して 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 に外部データソースにリンクするテーブルを作成する
  • 永続テーブルを使用してデータに対してクエリを実行する

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

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

Console

現時点では、GCP Console を使用して Cloud Bigtable データに対するクエリを実行することはできません。

従来の 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 テーブルの場合と同じようにクエリを実行できます。クエリの完了後は、結果を CSV または JSON としてエクスポート、テーブルとして保存、Google スプレッドシートに保存できます。

CLI

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

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

    bq mk \
    --external_table_definition=definition_file \
    dataset.table
    

    ここで

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

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

API

  • テーブル リソースsourceUris プロパティに指定できる Cloud Bigtable URI は 1 つだけです。これは完全指定の有効な HTTPS URL でなければなりません。

  • sourceFormat プロパティを設定して、データ形式プロパティを指定します。Cloud Bigtable の場合、"BIGTABLE" を指定します。

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

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

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

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

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

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

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

CLI

テーブル定義ファイルを使用して一時テーブルに対してクエリを実行するには、--external_table_definition フラグを指定して bq query コマンドを入力します。

(省略可)--location フラグを指定して、その値をロケーションに設定します。

bq --location=location query \
--use_legacy_sql=false \
--external_table_definition=table::definition_file \
'query'

ここで

  • location は、ロケーションの名前です。--location フラグは省略可能です。
  • table は、作成する一時テーブルの名前です。
  • definition_file は、ローカルマシン上のテーブル定義ファイルのパスです。
  • query は、一時テーブルに実行するクエリです。

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

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

API

  • クエリを作成します。クエリジョブの作成方法については、データのクエリをご覧ください。

  • (省略可)ジョブリソースjobReference セクションにある location プロパティでロケーションを指定します。

  • テーブル リソースExternalDataConfiguration を設定して、外部データソースのプロパティを指定します。

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

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 クエリでは操作が難しくなる場合があります。親の列ファミリー内で列がサブフィールドになる場合や、各セルから最新の値だけが読み取られる場合があります。これにより、デフォルト スキーマでは、両方の配列がスカラー値として扱われます。

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

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

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

SELECT
  COUNT(1)
FROM
  `dataset.table`
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`
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`
WHERE
  rowkey = "alice";

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

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

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

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