Bigtable でのデータ型の適用
Bigtable の柔軟なスキーマを使用すると、文字列、日付、数値、JSON ドキュメント、画像、PDF など、あらゆるタイプのデータを Bigtable テーブルに保存できます。
このドキュメントでは、Bigtable が型を適用し、アプリケーション コードでエンコードまたはデコードする必要がある場合について説明します。Bigtable データ型の一覧については、Data API リファレンス ドキュメントの型をご覧ください。
適用されるタイプ
次のデータにはデータ型が適用されます。
- 列ファミリーを集計する(カウンタ)
- タイムスタンプ
- マテリアライズド ビュー
集約
aggregate データ型の場合、エンコードは集計タイプによって異なります。集計列ファミリーを作成する場合は、集計タイプを指定する必要があります。
次の表に、各集計タイプの入力タイプとエンコードを示します。
集計タイプ | 入力タイプ | エンコード |
---|---|---|
合計 | 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 と一致) |
構造化された行キー
構造化された行キーを使用すると、リレーショナル データベースの複合キーと同様に、複数列のキーを使用してデータにアクセスできます。
構造化された行キーの型とエンコードは、Bigtable テーブルに必要に応じて追加できる行キー スキーマによって定義されます。構造化された行キーデータはバイトとして保存されますが、Bigtable 用 GoogleSQL は、テーブルに対して SQL クエリを実行するときに、行キー スキーマで定義された型とエンコードを自動的に使用します。
行キー スキーマを使用して ReadRows
リクエストでテーブルをクエリすることはできません。継続的マテリアライズド ビューには、デフォルトで行キー スキーマがあります。構造化された行キーの詳細については、行キー スキーマを管理するをご覧ください。
適用されていない型
型情報が指定されていない場合、Bigtable は各セルを不明なエンコードのバイトとして扱います。
型適用なしで作成された列ファミリーをクエリする場合は、データを正しく読み取るために、読み取り時に型情報を提供する必要があります。これは、動作がデータ型に依存するデータベース関数に関連します。Bigtable 用 GoogleSQL は、クエリ時に型変換を行う CAST 関数を提供します。これらの関数は、バイトからさまざまな関数が想定する型に変換します。
Bigtable では型が強制適用されることはありませんが、特定のオペレーションではデータ型が想定されます。このことを知っておくと、データベース内で処理できる方法でデータを書き込むことができます。次に例を示します。
ReadModifyWriteRow
を使用したインクリメントでは、セルに 64 ビット ビッグ エンディアン符号付き整数が含まれていることを前提としています。- SQL の
TO_VECTOR64
関数では、セルに 64 ビット浮動小数点数のビッグ エンディアン バイトを連結したバイト配列が含まれていることが想定されています。 - SQL の
TO_VECTOR32
関数は、セルに 32 ビット浮動小数点数のビッグ エンディアン バイトの連結であるバイト配列が含まれていることを想定しています。