Bigtable でのデータ型の強制

Bigtable の柔軟なスキーマを使用すると、文字列、日付、数値、JSON ドキュメント、画像、PDF など、あらゆる種類のデータを Bigtable テーブルに保存できます。

このドキュメントでは、Bigtable が型を強制し、アプリケーション コードでエンコードまたはデコードする必要がある場合について説明します。Bigtable のデータ型の一覧については、 Data API リファレンス ドキュメントの をご覧ください。

強制される型

次のデータにはデータ型が強制されます。

  • 集計列ファミリー(カウンタ)
  • タイムスタンプ
  • マテリアライズド ビュー

集約

集約データ型の場合、エンコードは集計タイプによって異なります。 集計列ファミリーを作成する場合は、集計タイプを指定する必要があります。

次の表に、集計タイプごとの入力タイプとエンコードを示します。

集計タイプ 入力タイプ エンコード
合計 Int64 BigEndianBytes
最小 Int64 BigEndianBytes
最大 Int64 BigEndianBytes
HLL バイト Zetasketch HLL++

SQL を使用して集計セル内のデータにクエリを実行すると、SQL は型情報を自動的に組み込みます。

Data API の ReadRows メソッドを使用して集計セル内のデータを読み取ると、Bigtable はバイトを返します。そのため、アプリケーションは、Bigtable が型付きデータをバイトにマッピングするために使用したエンコードを使用して値をデコードする必要があります。

非集計データを含む列ファミリーを集計列ファミリーに変換することはできません。集計列ファミリー内の列には非集計セルを含めることはできず、標準列ファミリーには集計セルを含めることはできません。

集計列ファミリーを使用してテーブルを作成する方法については、 テーブルを作成するをご覧ください。エンコードされた値を使用して集計セルをインクリメントする方法を示すコードサンプルについては、値をインクリメントするをご覧ください。

タイムスタンプ

各 Bigtable セルには Int64 タイムスタンプがあり、ミリ秒以下の精度のマイクロ秒値にする必要があります。Bigtable は、マイクロ秒精度のタイムスタンプ(3023483279876543 など)を拒否します。この例では、指定できるタイムスタンプ値は 3023483279876000 です。タイムスタンプは、 Unix エポックからの経過時間(マイクロ秒単位)1970-01-01 00:00:00 UTCです。

継続的マテリアライズド ビュー

継続的マテリアライズド ビューは読み取り専用リソースです。SQL または ReadRows Data API 呼び出しを使用して読み取ることができます。マテリアライズド ビューのデータは、それを定義するクエリに基づいて型指定されます。概要については、継続的 マテリアライズド ビューをご覧ください。

SQL を使用して継続的マテリアライズド ビューにクエリを実行すると、SQL は型情報を自動的に組み込みます。

Data API ReadRows リクエストを使用して継続的マテリアライズド ビューから読み取る 場合は、各列の型を把握し、ご使用の アプリケーション コードでデコードする必要があります。

継続的マテリアライズド ビューの集計値は、ビュー定義の列の出力タイプに基づいて、次の表に示すエンコードを使用して保存されます。

エンコード
BOOL 1 バイト値、1 = true、0 = false
BYTES エンコードなし
INT64(または INT、SMALLINT、INTEGER、BIGINT、TINYINT、BYTEINT) 64 ビット ビッグ エンディアン
FLOAT64 64 ビット IEEE 754(NaN と +/-inf を除く)
STRING UTF-8
TIME/TIMESTAMP Unix エポックからの経過マイクロ秒数を表す 64 ビット整数(GoogleSQL と一致)
詳細については、Data API リファレンスの
エンコードをご覧ください。

構造化行キー

構造化行キーを使用すると、リレーショナル データベースの複合キーと同様に、複数列キーを使用してデータにアクセスできます。

構造化行キーの型とエンコードは、Bigtable テーブルに必要に応じて追加できる行キー スキーマによって定義されます。 構造化行キーデータはバイトとして保存されますが、Bigtable 用の GoogleSQL は、テーブルに対して SQL クエリを実行するときに、行キー スキーマで定義された型とエンコードを自動的に使用します。

行キー スキーマを使用して ReadRows リクエストでテーブルにクエリを実行することはできません。継続的マテリアライズド ビューには、デフォルトで行キー スキーマがあります。構造化行キーの詳細については、行キー スキーマを管理するをご覧ください。

強制されない型

型情報が指定されていない場合、Bigtable は各セルを不明なエンコードのバイトとして扱います。

型強制なしで作成された列ファミリーにクエリを実行する場合は、データを正しく読み取るために、読み取り時に型情報を指定する必要があります。これは、動作がデータ型に依存するデータベース関数に関連します。Bigtable 用の GoogleSQL には、クエリ時に型変換を行う CAST 関数が用意されています。これらの関数は、さまざまな関数が想定する型にバイトを変換します。

Bigtable は型を強制しませんが、特定のオペレーションではデータ型が想定されます。これを把握することで、データベース内で処理できる方法でデータが書き込まれるようにできます。次に例を示します。

  • ReadModifyWriteRow を使用したインクリメントでは、セルに 64 ビット ビッグ エンディアン符号付き整数が含まれていることを前提としています。
  • SQL の TO_VECTOR64 関数は、セルに 64 ビット浮動小数点数のビッグ エンディアン バイトの連結であるバイト配列が含まれていることを想定しています。
  • SQL の TO_VECTOR32 関数は、セルに 32 ビット浮動小数点数のビッグ エンディアン バイトの連結であるバイト配列が含まれていることを想定しています。

次のステップ