書き込み時に値を集計する

書き込み時に Bigtable でカウンタを作成またはデータを集計する場合は、集計を使用できます。集計は、データの書き込み時にセル値を集計する Bigtable テーブルセルです。新しい値を追加すると、集計関数によってその値とセル内の集計値が自動的に結合されます。他のデータベースでは、同様の機能を分散カウンタと呼びます。

集計値の読み取りと書き込みには、cbt CLI と C++、Go、Java 用の Bigtable クライアント ライブラリを使用します。集計結果を SQL を使用して読み取ることもできます。集計セルを更新するには、AddToCell ミューテーションまたは MergeToCell ミューテーションを使用して MutateRow リクエストを送信するメソッドを使用します。MergeToCell を使用するとアキュムレータを統合でき、AddToCell を使用すると入力を追加できます。

このドキュメントでは、集計の概要と、集計列ファミリーの作成方法について説明します。このドキュメントを読む前に、Bigtable の概要書き込みについて理解しておく必要があります。

集計を使用する場合

Bigtable の集計は、個々のデータポイントではなく、エンティティのデータを集計で重視する状況に役立ちます。

カウンタ

集計セルを使用してカウンタを作成し、書き込み時に値をインクリメントできます。ReadModifyWriteRow リクエストに関連する制限はありません。

Apache Cassandra や Redis などのデータベースから Bigtable に移行する場合、以前はこれらのシステムのカウンターに依存していた場所で Bigtable 集計を使用できます。

cbt CLI を使用してカウンタを実装する方法を紹介するクイックスタートについては、カウンタを作成して更新するをご覧ください。

時間バケット

時間バケットを使用すると、時間、日、週などの期間の集計値を取得できます。テーブルに書き込まれる前または後にデータを集計するのではなく、テーブル内の集計セルに新しい値を追加します。

たとえば、慈善団体の募金を支援するサービスを運営している場合、キャンペーンごとに 1 日あたりのオンライン寄付の金額を知る必要がありますが、各寄付の正確な時間や 1 時間あたりの金額を知る必要はありません。テーブルでは、行キーがチャリティ ID を表し、donations という集計列ファミリーを作成します。行の列修飾子はキャンペーン ID です。

キャンペーンで 1 日に受け取った寄付の金額に応じて、その日の列の集計セルの合計に加算されます。セルの各追加リクエストでは、その日の始めに切り捨てられたタイムスタンプを使用するため、実際には各リクエストのタイムスタンプは同じになります。タイムスタンプを切り捨てることで、その日の寄付がすべて同じセルに追加されます。翌日、すべてのリクエストが新しいセルに移動し、タイムスタンプが新しい日付に切り捨てられます。このパターンは続きます。

ユースケースによっては、代わりに新しい集計用に新しい列を作成することを選択することもできます。使用するバケットの数によっては、行キーの設計を変えることを検討してください

時間バケットの詳細については、時系列のスキーマの設計データをご覧ください。

ワークフローのストリーミング

集計を使用すると、Bigtable にデータを書き込む前または後に ETL またはストリーミング処理ソフトウェアを使用してデータを集計する必要なく、Bigtable テーブルにデータを集計できます。たとえば、アプリケーションが以前に Pub/Sub にメッセージをパブリッシュし、Dataflow を使用してメッセージを読み取り、Bigtable に書き込む前にデータを集計していた場合、そのデータを Bigtable の集計セルに直接送信することもできます。

列ファミリーを集計する

集計セルを作成および更新するには、テーブルに 1 つ以上の集計列ファミリー(集計セルのみを含む列ファミリー)が必要です。テーブルを作成するときに作成することも、すでに使用されているテーブルに集計列ファミリを追加することもできます。列ファミリーを作成する場合は、合計などの集計方法を指定します。

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

集計列ファミリーを含む新しいテーブルを作成するには、テーブルの作成をご覧ください。集計列ファミリーをテーブルに追加するには、列ファミリーを追加するをご覧ください。

集計の種類

Bigtable は、次の集計タイプをサポートしています。

合計

合計の集計セル(sum)に値を書き込むと、セルの値は新しく追加された値と現在のセル値の合計に置き換えられます。合計にサポートされている入力タイプは Int64 です。

最小

最小集計セル(min)に値を書き込むと、セルの値は新しく追加された値と現在のセル値の間の低い値に置き換えられます。最小にサポートされている入力タイプは Int64 です。

最大

最大集計セル(max)に値を書き込むと、セルの値は新しく追加された値と現在のセル値の間の高い値に置き換えられます。最大にサポートされている入力タイプは Int64 です。

HyperLogLog(HLL)

HLL 集計セル(inthll)に値を書き込むと、その値は直近のリセット以降に追加されたすべての値の確率セットに追加されます。セル値は、そのセットの状態を表します。HLL アルゴリズムの一般的な情報については、HyperLogLog をご覧ください。

HLL 値は Zetasketch ライブラリを使用して読み取ることができます。詳細については、Zetasketch GitHub リポジトリをご覧ください。HLL にサポートされている入力タイプは BYTES です。

タイムスタンプ

集計セルは、行キー、列ファミリー、列修飾子、タイムスタンプで定義されます。セルにデータを追加するたびに同じタイムスタンプを使用します。タイムスタンプが異なる同じ行キー、列ファミリー、列修飾子に値を送信すると、列に新しい集計セルが作成されます。

集計セルに送信するリクエストには、タイムスタンプを含める必要があります。

入力タイプ

書き込みリクエストの値の入力タイプは、列ファミリの作成に使用された入力タイプと一致する必要があります。たとえば、Int64 用に構成された列ファミリーに文字列値を送信すると、リクエストは拒否されます。

ミューテーション タイプ

Bigtable MutateRow リクエストには、テーブルに対する変更であるミューテーションのタイプが含まれます。集計セルの作成と更新に送信できるミューテーション タイプは、AddToCellMergeToCell です。一方、集約以外の書き込みには SetCell ミューテーションが含まれます。削除ミューテーションを使用して、セルの累積値を消去することもできます。

複製されたテーブルでは、集計セルは現在のレプリケーション遅延内ですべてのクラスタで同じ最終値に収束します。最終値は、最後の削除オペレーション以降またはセルの作成以降にすべてのクラスタでそのセルに送信されたすべての AddToCell ミューテーションの集計です。

集計オペレーションには、他のテーブル変更と同様のオペレーションの上限が適用されます。

AddToCell

カウンタをインクリメントする場合など、集計セルにデータを追加するには、MutateRow リクエストで AddToCell ミューテーションを送信します。詳細については、Bigtable Data API リファレンスの AddToCell をご覧ください。

MergeToCell

セル間でデータをコピーする場合は、MergeToCell ミューテーションを使用します。たとえば、セル A からセル B に状態をコピーするには、セル A から読み取った値で [DeleteCell(B), MergeToCell(B)] のような操作を行います。詳細については、Bigtable Data API リファレンスの MergeToCell をご覧ください。

削除

集計されていないデータの場合と同様に、Data API ミューテーションを使用してカウンタをリセットしたり、集計データを削除したりできます。詳細については、Bigtable Data API リファレンスの Mutation をご覧ください。

ガベージ コレクション

集計セルは、ガベージ コレクション中に他のセルと同様に処理されます。セルが削除対象としてマークされている場合、削除はインスタンス内のすべてのクラスタに複製されます。詳細については、レプリケーションとガベージ コレクションをご覧ください。ガベージ コレクションによって削除された集計セルに追加リクエストが送信された場合、新しい集計セルが作成されます。

次のステップ