Table Store は、BatchGetRow、BatchWriteRow、GetRange などの複数行操作用のインターフェイスを提供します。
BatchGetRow
バッチは、1 つ以上のテーブルから複数行のデータを読み取ります。
BatchGetRow は、複数の GetRow 操作のセットと見なすことができます。 各操作の実行、結果の返し、およびサービスキャパシティーユニットの計算はすべて独立して行われます。 多数の GetRow 操作を実行する場合と比較して、BatchGetRow を使用すると、要求の応答時間を効果的に短縮し、データ読み取り速度を向上させることができます。
BatchGetRow を使用すると、2つの考えられるエラーが発生する可能性があります。
- ネットワークエラーなどの全体的な要求エラーがある場合。 これらのエラーは batchGetRow() の戻り値に格納されます。
- 全体的な要求エラーはなく、個々の行にエラーが含まれている場合。 これらのエラーは対応する行の結果に格納されます。
例
BatchGetRowRequest req;
{
MultiPointQueryCriterion& criterion = req.mutableCriteria().append();
IVector<MultiPointQueryCriterion::RowKey>& rowkeys = criterion.mutableRowKeys();
{
MultiPointQueryCriterion::RowKey& exist = rowkeys.append();
exist.mutableGet().append() = PrimaryKeyColumn(
"pkey",
PrimaryKeyValue::toStr("some key"));
exist.mutableUserData() = &userDataForSomeKey;
}
{
MultiPointQueryCriterion::RowKey& exist = rowkeys.append();
exist.mutableGet().append() = PrimaryKeyColumn(
"pkey",
PrimaryKeyValue::toStr("another key"));
exist.mutableUserData() = &userDataForAnotherKey;
}
criterion.mutableTable() = "YourTable";
criterion.mutableMaxVersions().reset(1);
}
BatchGetRowResponse resp;
Optional<OTSError> res = client.batchGetRow(resp, req);
BatchWriteRow
1 つ以上のテーブルから複数行のデータを一括して挿入、変更、または削除します。
BatchWriteRow は、複数の PutRow、UpdateRow および DeleteRow 操作のセットと見なすことができます。 各操作の実行、結果の戻し、およびサービスキャパシティーユニットの計算はすべて独立して行われます。
BatchWriteRow を使用すると、2 つの考えられるエラーが発生する可能性があります。
- ネットワークタイムアウトなどの全体的な要求エラーの場合。 これらのエラーは batchWriteRow() の戻り値に格納されています。
- 無効な主キー値など、個々の行のエラーの場合。 これらのエラーは BatchWriteRowResponse のすべての行に格納されています。
例
static const char kPutRow[] = "PutRow";
static const char kUpdateRow[] = "UpdateRow";
static const char kDeleteRow[] = "DeleteRow";
BatchWriteRowRequest req;
{
// 行を挿入します。
BatchWriteRowRequest::Put& put = req.mutablePuts().append();
put.mutableUserData() = kPutRow;
put.mutableGet().mutableTable() = kTableName;
PrimaryKey& pkey = put.mutableGet().mutablePrimaryKey();
pkey.append() = PrimaryKeyColumn(
"pkey",
PrimaryKeyValue::toStr("row to put"));
}
{
// 行を更新します。
BatchWriteRowRequest::Update& update = req.mutableUpdates().append();
update.mutableUserData() = kUpdateRow;
update.mutableGet().mutableTable() = kTableName;
PrimaryKey& pkey = update.mutableGet().mutablePrimaryKey();
pkey.append() = PrimaryKeyColumn(
"pkey",
PrimaryKeyValue::toStr("row to update"));
RowUpdateChange::Update& attr = update.mutableGet().mutableUpdates().append();
attr.mutableType() = RowUpdateChange::Update::kPut;
attr.mutableAttrName() = "attr0";
attr.mutableAttrValue().reset(AttributeValue::toStr("some value"));
}
{
// 行を削除します。
BatchWriteRowRequest::Delete& del = req.mutableDeletes().append();
del.mutableUserData() = kDeleteRow;
del.mutableGet().mutableTable() = kTableName;
PrimaryKey& pkey = del.mutableGet().mutablePrimaryKey();
pkey.append() = PrimaryKeyColumn(
"pkey",
PrimaryKeyValue::toStr("row to delete"));
}
BatchWriteRowResponse resp;
Optional<OTSError> res = client.batchWriteRow(resp, req);
GetRange
指定された主キー範囲内のデータを読み取ります。
RangeIterator
を推奨します。 RangeIterator を構築するには、
-
AsyncClient を提供する必要があります。
-
RangeQueryCriterion は PointQueryCriterion に似ていますが、RangeQueryCriterion は以下も必要とします。
-
範囲の始点 (inclusive) と終点 (exclusive) を設定します。 通常のプライマリキー値に加えて、2 つの特別な値、「負の無限大」 (すべての通常のプライマリキー列の値より厳密に小さい値) および「正の無限大」 (すべてのプライマリキーの列値より厳密に大きい値) も使用できます。
-
読み値をポジティブシーケンス (小さい値から大きい値へ)またはリバースシーケンス (大きい値から小さい値へ) に設定します。 デフォルト設定はポジティブシーケンスです。 ポジティブシーケンスで読むときは、始点は終点より小さくなければなりません。 リバースシーケンスでは、始点は終点より大きくなければなりません。
-
RangeIterator オブジェクトは、3 つのインターフェイスを提供する反復子です。
-
moveNext()
は、RangeIterator オブジェクトを次の行に移動します。 新しく構築された RangeIterator オブジェクトはmoveNext()
を呼び出して、値を取得する必要があります。 データの読み取りに失敗した場合は、moveNext()
は、戻り値にエラーを表示します。 -
valid()
は、RangeIterator オブジェクトが範囲の終点に達したかどうかを示します。 -
valid()
が true の場合、行オブジェクトはget()
を使用して読み取ることができます。get()
によって戻される行オブジェクトの内容を削除すると、メモリの複製を回避できます。 コンテンツを削除した後、すぐ後に続くget()
は削除されたコンテンツを返します。
例
RangeQueryCriterion query;
query.mutableTable() = "YourTable";
query.mutableMaxVersions().reset(1);
{
PrimaryKey& start = query.mutableInclusiveStart();
start.append() = PrimaryKeyColumn(
"pkey",
PrimaryKeyValue::toInfMin());
}
{
PrimaryKey& end = query.mutableExclusiveEnd();
end.append() = PrimaryKeyColumn(
"pkey",
PrimaryKeyValue::toInfMax());
}
auto_ptr<AsyncClient> aclient(AsyncClient::create(client));
RangeIterator iter(*aclient, query);
for(;;) {
Optional<OTSError> err = iter.moveNext();
if (err.present()) {
// err で何かをします。
abort();
}
if (! iter.valid()) {
break;
}
Row& row = iter.get();
// 行で何かをします。
}
指定された列を読み取る
Table Store は、無限の行幅をサポートしています。 通常、指定された列を読み取るだけで十分なので、行全体を読み取る必要はありません。 クエリ基準
(PointQueryCriterion、MultiPointQueryCriterion および RangeQueryCriterion) は、 mutableColumnsToGet()
を提供して、読み込む必要がある列を指定します。 それらは属性列またはプライマリキー列にすることができます。 値が空の場合は、行全体が読み取られます。
指定された列が読み取り行に存在しない場合、その列は返された結果から欠落しています。 Table Store はプレースホルダを提供しません。
GetRange では、指定されたすべての列が属性列であり、範囲内の行が指定されたすべての列を見逃した場合、この行は結果に表示されません。 この行に注目する必要がある場合は、指定した列にプライマリキー列を追加してください。
指定されたバージョンを読む
各属性列には複数のバージョンを含めることができ、各バージョン番号 (タイムスタンプ) は列の値に対応します。 読み取るときに、バージョンの数 mutableMaxVersions()
) とバージョンの範囲 mutableTimeRange()
を定義して、読み取ることができます。
maxversions とバージョンの範囲の少なくとも一方を定義する必要があります。
- バージョン数のみを定義した場合は、すべてのバージョンで定義されているデータ量が最新のものから順に返されます。
- バージョンの範囲のみを定義した場合は、この範囲内のすべてのデータが返されます。
- バージョン数とバージョン範囲の両方を定義した場合は、バージョンの範囲内で定義されているデータ量が最新のものから古いものの順に返されます。
条件付き書き込み
条件付き書き込みでは、行を書き込む前に特定の条件を確認して満たす必要があります。 Table Store は、条件チェックと書き込みの原子性を保証します。
Table Store は行の存在条件と列の値条件をサポートします。
-
行の存在条件は、次の種類に分類できます。
- Ignore: 行が存在するかどうかにかかわらず、これがデフォルト設定です。
- ExpectExist: 存在すると予想します。 行が存在する場合は書き込みます。
- ExpectNotExist: 存在しないと予想します。 行が存在しない場合は書き込みます。
-
列値の条件は、「フィルター」と同じです。