説明
テーブルの基本単位は行であり、プライマリキー列と属性列で構成されます。プライマリキー列は必須であり、その名前と型はすべての行で同じでなければなりません。属性列はオプションであり、属性は行ごとに異なる場合があります。詳細については、「ワイドテーブルモデル」をご参照ください。
注意
自動採番主キー列を持つテーブルからデータを読み取る場合、自動インクリメント列の値を含む完全なプライマリキーを指定する必要があります。詳細については、「自動採番主キー列」をご参照ください。
重要
自動採番主キー列の値がわからない場合は、最初のプライマリキー列で範囲クエリを実行してデータを読み取ることができます。
単一行のデータの読み取り
GetRow 操作を呼び出して、単一行のデータを読み取ることができます。この操作は、完全なプライマリキーがわかっており、少数の行のみを読み取る必要がある場合に役立ちます。
単一行を読み取る際に、以下の条件を設定してデータをフィルタリングできます。
-
デフォルトでは、すべての列が返されます。特定の列のみを返すように操作を設定できます。
-
フィルターを使用して、特定のフィルター条件を満たす行を返します。詳細については、「フィルター」をご参照ください。
-
テーブルに複数のデータバージョンを設定している場合、読み取る最大バージョン数を指定できます。また、特定の時間範囲または特定のバージョン番号のデータを読み取ることもできます。データバージョンの詳細については、「データバージョンとライフサイクル」をご参照ください。
読み取り操作の結果は、次の 2 つのいずれかになります。
データのバッチ読み取り
BatchGetRow 操作を呼び出して、1 つのリクエストで複数行を読み取ったり、複数のテーブルから同時にデータを読み取ったりすることができます。この操作は、完全なプライマリキーがわかっており、多くの行や複数のテーブルからデータを読み取る必要がある場合に役立ちます。
BatchGetRow 操作は、複数の GetRow サブオペレーションで構成されます。サブオペレーションの構築プロセスは、GetRow 操作と同じです。
データをバッチで読み取る際に、以下の条件を設定してデータをフィルタリングできます。
-
1 つのリクエストで複数のテーブルからデータを読み取ります。
1 つのリクエストで最大 100 行を読み取ることができます。
-
デフォルトでは、すべての列が返されます。特定の列のみを返すように操作を設定できます。
バッチ読み取りのすべての行は、同じパラメーター条件を使用します。たとえば、ColumnsToGet=[colA] は、指定されたすべての行に対して colA 列のみが取得されることを意味します。
-
フィルターを使用して、特定のフィルター条件を満たす行を取得します。詳細については、「フィルター」をご参照ください。
-
テーブルに複数のデータバージョンを設定している場合、読み取る最大バージョン数を指定できます。また、特定の時間範囲または特定のバージョン番号のデータを読み取ることもできます。データバージョンの詳細については、「データバージョンとライフサイクル」をご参照ください。
BatchGetRow 操作のサブオペレーションは独立して実行され、Tablestore は各サブオペレーションの結果を返します。
範囲内のデータの読み取り
GetRange 操作を呼び出して、指定された範囲内のデータを読み取ることができます。この操作は、完全なプライマリキーの範囲またはキープレフィックスを特定できる場合に役立ちます。
説明
Tablestore テーブルでは、すべての行がプライマリキーによってソートされます。テーブルのプライマリキーは、すべてのプライマリキー列で順次構成されます。したがって、行は特定のプライマリキー列に基づいてソートされるわけではありません。
GetRange 操作は、左端マッチングの原則に従います。Tablestore は、最初のプライマリキー列から最後のプライマリキー列まで順番に値を比較し、プライマリキー値が指定された範囲内にあるデータを読み取ります。たとえば、データテーブルのプライマリキーが PK1、PK2、PK3 というプライマリキー列で構成されているとします。データの読み取り時、Tablestore はまず、ある行の PK1 の値が最初のプライマリキー列に指定された範囲内にあるかどうかを判断します。行の PK1 の値が範囲内にある場合、Tablestore はその行の他のプライマリキー列の値が各プライマリキー列に指定された範囲内にあるかどうかの判断を停止し、その行を返します。行の PK1 の値が範囲内にない場合、Tablestore は PK1 と同様に、その行の他のプライマリキー列の値が各プライマリキー列に指定された範囲内にあるかどうかを判断し続けます。
範囲内のデータを読み取る際に、以下の条件を設定してデータをフィルタリングできます。
-
キープレフィックスを指定し、他のプライマリキー列には仮想的な点である INF_MIN (無限小) と INF_MAX (無限大) を使用します。また、完全なプライマリキー範囲を指定してデータを読み取ることもできます。
重要
キープレフィックスを特定できない場合は、プライマリキー範囲全体を INF_MIN から INF_MAX に設定することで、全表スキャンを実行できます。この操作は大量の計算リソースを消費するため、注意して使用してください。
範囲が大きい場合、スキャンされた行数またはデータ量が一定の制限を超えるとスキャンは停止します。操作は取得された行と次のプライマリキーに関する情報を返します。返された次のプライマリキー情報を使用して、別のリクエストを開始し、範囲内の残りの行を取得できます。
-
順方向または逆方向で指定された最大行数を読み取ります。たとえば、順方向で最大 5 行を読み取ることができます。
-
デフォルトでは、すべての列が返されます。特定の列のみを返すように操作を設定できます。
-
フィルターを使用して、特定のフィルター条件を満たす行を取得します。詳細については、「フィルター」をご参照ください。
範囲読み取りのすべての行は、同じパラメーター条件を使用します。たとえば、ColumnsToGet=[colA] は、範囲内のすべての行に対して colA 列のみが取得されることを意味します。
-
テーブルに複数のデータバージョンを設定している場合、読み取る最大バージョン数を指定できます。また、特定の時間範囲または特定のバージョン番号のデータを読み取ることもできます。データバージョンの詳細については、「データバージョンとライフサイクル」をご参照ください。
GetRange を使用して大量のデータをスキャンする場合、Tablestore はリクエストごとに 1 回のスキャンのみを実行します。行数が 5,000 を超えるか、データサイズが 4 MB を超えるとスキャンは停止します。これらの制限を超えるデータは返されません。後続のデータを取得するには、ページネーションを使用する必要があります。
使用方法
コンソールの使用
コンソールを使用して、単一行のクエリまたは範囲内のデータのクエリを実行できます。
-
Tablestore コンソールにログインします。
-
概要ページでインスタンスを見つけ、操作列の インスタンス管理をクリックします。
-
インスタンス詳細タブの データテーブルリストセクションでテーブルを見つけ、操作列の クエリ/検索をクリックします。
-
データ管理タブで、データのクエリをクリックします。次に、単一行を読み取るか、範囲内のデータを読み取るかを選択します。
単一行のデータの読み取り
-
データのクエリダイアログボックスで、クエリ範囲を 単一行クエリに設定し、クエリするテーブルを選択します。
-
デフォルトでは、すべての列が返されます。特定の属性列のみを返すには、すべての列を取得を無効にし、目的の属性列を入力します。
複数の属性列はコンマ (,) で区切ります。
-
対象行の プライマリキー値を入力します。
プライマリキー値の完全性と精度がクエリ結果に影響します。
-
最大バージョン数を入力して、返すバージョン数を指定します。
-
OK をクリックします。
範囲内のデータの読み取り
-
データのクエリダイアログボックスで、クエリ範囲を 範囲クエリに設定し、クエリするテーブルを選択します。
-
デフォルトでは、すべての列が返されます。特定の属性列のみを返すには、すべての列を取得を無効にし、目的の属性列を入力します。
複数の属性列はコンマ (,) で区切ります。
-
開始と終了のプライマリキー列を入力します。
-
最大バージョン数を入力して、返すバージョン数を指定します。
-
クエリ結果のソート方向を設定します。順方向クエリまたは 逆方向クエリを選択できます。
-
OK をクリックします。
コマンドラインインターフェイス (CLI) の使用
コマンドラインインターフェイス (CLI) を使用して、以下のコマンドを実行してデータを読み取ることができます。
-
get コマンドを実行して、単一行のデータを読み取ります。詳細については、「データの読み取り」をご参照ください。
次の例では、最初のプライマリキー列の値が "86" で、2 番目のプライマリキー列の値が 6771 の行を読み取ります。
get --pk '["86",6771]'
-
scan コマンドを実行して、範囲内のデータを読み取ります。詳細については、「データのエクスポート」をご参照ください。
次の例では、["86",7000] と ["86",6770] の間のプライマリキー範囲からデータを逆順に読み取り、pid 列のみを返します。
scan --begin '["86",7000]' --end '["86",6770]' --backward --columns pid
SDK の使用
Java SDK、Go SDK、Python SDK、Node.js SDK、.NET SDK、または PHP SDK を使用してデータを読み取ることができます。このセクションでは、Java SDK を例として使用します。
単一行のデータの読み取り
データを読み取る際に、データバージョン、読み取る列、フィルター、正規表現フィルターを指定できます。
-
最新バージョンのデータと特定の列を読み取る
次のサンプルコードは、データテーブルの行の指定された列から最新バージョンのデータを読み取る方法の例を示しています。
private static void getRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブル名とプライマリキーを指定して、1 行のデータを読み取ります。
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", primaryKey);
// MaxVersions パラメーターを 1 に設定して、最新バージョンのデータを読み取ります。
criteria.setMaxVersions(1);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row row = getRowResponse.getRow();
System.out.println("Read complete. Result:");
System.out.println(row);
// 読み取る列を指定します。
criteria.addColumnsToGet("Col0");
getRowResponse = client.getRow(new GetRowRequest(criteria));
row = getRowResponse.getRow();
System.out.println("Read complete. Result:");
System.out.println(row);
}
-
フィルターを使用したデータの読み取り
次のサンプルコードは、データテーブルの行から最新バージョンのデータを読み取り、フィルターを使用して Col0 列の値に基づいてデータをフィルタリングする方法の例を示しています。
private static void getRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブル名とプライマリキーを指定して、1 行のデータを読み取ります。
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", primaryKey);
// MaxVersions パラメーターを 1 に設定して、最新バージョンのデータを読み取ります。
criteria.setMaxVersions(1);
// Col0 列の値が 0 の行を返すようにフィルターを設定します。
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0",
SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
// Col0 列が存在しない場合、行は返されません。
singleColumnValueFilter.setPassIfMissing(false);
criteria.setFilter(singleColumnValueFilter);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row row = getRowResponse.getRow();
System.out.println("Read complete. Result:");
System.out.println(row);
}
-
データ読み取り時に正規表現フィルターを使用する
次のサンプルコードは、データテーブルの行から Col1 列のデータを読み取り、正規表現を使用して列内のデータをフィルタリングする方法の例を示しています。
private static void getRow(SyncClient client, String pkValue) {
// データテーブルの名前を指定します。
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>");
// プライマリキーを構築します。
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue))
.build();
criteria.setPrimaryKey(primaryKey);
// MaxVersions パラメーターを 1 に設定して、最新バージョンのデータを読み取ります。
criteria.setMaxVersions(1);
// フィルターを設定します。cast<int>(regex(Col1)) が 100 より大きい場合に、行が返されます。
RegexRule regexRule = new RegexRule("t1:([0-9]+),", RegexRule.CastType.VT_INTEGER);
SingleColumnValueRegexFilter filter = new SingleColumnValueRegexFilter("Col1",
regexRule,SingleColumnValueRegexFilter.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100));
criteria.setFilter(filter);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row row = getRowResponse.getRow();
System.out.println("Read complete. Result:");
System.out.println(row);
}
データのバッチ読み取り
次のサンプルコードは、バージョン条件、読み取る列、およびフィルターを設定して 10 行のデータを読み取る方法の例を示しています。
private static void batchGetRow(SyncClient client) {
// データテーブルの名前を指定します。
MultiRowQueryCriteria multiRowQueryCriteria = new MultiRowQueryCriteria("<TABLE_NAME>");
// 読み取る 10 行を指定します。
for (int i = 0; i < 10; i++) {
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk" + i));
PrimaryKey primaryKey = primaryKeyBuilder.build();
multiRowQueryCriteria.addRow(primaryKey);
}
// 条件を追加します。
multiRowQueryCriteria.setMaxVersions(1);
multiRowQueryCriteria.addColumnsToGet("Col0");
multiRowQueryCriteria.addColumnsToGet("Col1");
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("Col0",
SingleColumnValueFilter.CompareOperator.EQUAL, ColumnValue.fromLong(0));
singleColumnValueFilter.setPassIfMissing(false);
multiRowQueryCriteria.setFilter(singleColumnValueFilter);
BatchGetRowRequest batchGetRowRequest = new BatchGetRowRequest();
// BatchGetRow 操作では、複数のテーブルからデータを読み取ることができます。各 multiRowQueryCriteria パラメーターは、1 つのテーブルのクエリ条件を指定します。複数の multiRowQueryCriteria パラメーターを追加して、複数のテーブルからデータを読み取ることができます。
batchGetRowRequest.addMultiRowQueryCriteria(multiRowQueryCriteria);
BatchGetRowResponse batchGetRowResponse = client.batchGetRow(batchGetRowRequest);
System.out.println("Whether all operations are successful:" + batchGetRowResponse.isAllSucceed());
System.out.println("Read complete. Result:");
for (BatchGetRowResponse.RowResult rowResult : batchGetRowResponse.getSucceedRows()) {
System.out.println(rowResult.getRow());
}
if (!batchGetRowResponse.isAllSucceed()) {
for (BatchGetRowResponse.RowResult rowResult : batchGetRowResponse.getFailedRows()) {
System.out.println("Failed rows:" + batchGetRowRequest.getPrimaryKey(rowResult.getTableName(), rowResult.getIndex()));
System.out.println("Cause of failures:" + rowResult.getError());
}
/**
* createRequestForRetry メソッドを使用して、別のリクエストを構築し、失敗した行の操作をリトライできます。この例では、リトライリクエストのみが構築されます。
* Tablestore SDK のカスタムリトライポリシーをリトライメソッドとして使用することを推奨します。これにより、バッチ操作が実行された後に失敗した行をリトライできます。リトライポリシーを指定すると、操作を呼び出すためのリトライコードを追加する必要がありません。
*/
BatchGetRowRequest retryRequest = batchGetRowRequest.createRequestForRetry(batchGetRowResponse.getFailedRows());
}
}
範囲内のデータの読み取り
-
定義された範囲内のデータを読み取る
次のサンプルコードは、プライマリキー値が指定された範囲内にあるデータを順方向に読み取る方法の例を示しています。応答の nextStartPrimaryKey パラメーターの値が空の場合、指定された範囲内のプライマリキー値を持つすべてのデータが読み取られます。それ以外の場合は、指定された範囲内のプライマリキー値を持つすべてのデータが返されるまで、別のリクエストを開始する必要があります。
private static void getRange(SyncClient client, String startPkValue, String endPkValue) {
// データテーブルの名前を指定します。
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<TABLE_NAME>");
// 開始プライマリキーを指定します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(startPkValue));
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
// 終了プライマリキーを指定します。
primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(endPkValue));
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
rangeRowQueryCriteria.setMaxVersions(1);
System.out.println("GetRange result:");
while (true) {
GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
for (Row row : getRangeResponse.getRows()) {
System.out.println(row);
}
// nextStartPrimaryKey パラメーターの値が null でない場合、読み取り操作を続行します。
if (getRangeResponse.getNextStartPrimaryKey() != null) {
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
} else {
break;
}
}
}
-
最初のプライマリキー列で定義された範囲に基づいてデータを読み取る
次のサンプルコードは、最初のプライマリキー列の値によって決定される範囲内のデータを順方向に読み取る方法の例を示しています。この例では、2 番目のプライマリキー列の開始値は INF_MIN に設定され、2 番目のプライマリキー列の終了値は INF_MAX に設定されています。応答の nextStartPrimaryKey パラメーターの値が null の場合、指定された範囲内のすべてのデータが読み取られます。それ以外の場合は、最初のプライマリキー列の値によって決定される範囲内のすべてのデータが返されるまで、別のリクエストを開始する必要があります。
private static void getRange(SyncClient client, String startPkValue, String endPkValue) {
// データテーブルの名前を指定します。
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<TABLE_NAME>");
// 開始プライマリキーを指定します。この例では、2 つのプライマリキー列が使用されます。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString(startPkValue));// 最初のプライマリキー列の値を特定の値に設定します。
primaryKeyBuilder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.INF_MIN);// 2 番目のプライマリキー列の値を無限小の値に設定します。
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
// 終了プライマリキーを指定します。
primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString(endPkValue));// 最初のプライマリキー列の値を特定の値に設定します。
primaryKeyBuilder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.INF_MAX);// 2 番目のプライマリキー列の値を無限大の値に設定します。
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
rangeRowQueryCriteria.setMaxVersions(1);
System.out.println("GetRange result:");
while (true) {
GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
for (Row row : getRangeResponse.getRows()) {
System.out.println(row);
}
// nextStartPrimaryKey パラメーターの値が null でない場合、読み取り操作を続行します。
if (getRangeResponse.getNextStartPrimaryKey() != null) {
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
} else {
break;
}
}
}
-
定義された範囲内のデータを読み取り、特定の列に正規表現フィルターを適用する
次のサンプルコードは、プライマリキー値が ["pk:2020-01-01.log", "pk:2021-01-01.log") の範囲にあるデータを Col1 列から読み取り、正規表現を使用して Col1 列のデータをフィルタリングする方法の例を示しています。
private static void getRange(SyncClient client) {
// データテーブルの名前を指定します。
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("<TABLE_NAME>");
// 読み取るデータのプライマリキーの範囲として ["pk:2020-01-01.log", "pk:2021-01-01.log") を指定します。範囲は左閉右開区間です。
PrimaryKey pk0 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("2020-01-01.log"))
.build();
PrimaryKey pk1 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("2021-01-01.log"))
.build();
criteria.setInclusiveStartPrimaryKey(pk0);
criteria.setExclusiveEndPrimaryKey(pk1);
// MaxVersions パラメーターを 1 に設定して、最新バージョンのデータを読み取ります。
criteria.setMaxVersions(1);
// フィルターを設定します。cast<int>(regex(Col1)) が 100 より大きい場合に、行が返されます。
RegexRule regexRule = new RegexRule("t1:([0-9]+),", RegexRule.CastType.VT_INTEGER);
SingleColumnValueRegexFilter filter = new SingleColumnValueRegexFilter("Col1",
regexRule,SingleColumnValueRegexFilter.CompareOperator.GREATER_THAN,ColumnValue.fromLong(100));
criteria.setFilter(filter);
while (true) {
GetRangeResponse resp = client.getRange(new GetRangeRequest(criteria));
for (Row row : resp.getRows()) {
// 何らかの処理を行う
System.out.println(row);
}
if (resp.getNextStartPrimaryKey() != null) {
criteria.setInclusiveStartPrimaryKey(resp.getNextStartPrimaryKey());
} else {
break;
}
}
}
課金に関する説明
操作によって消費されたキャパシティユニット (CU) の数に基づいて課金されます。従量課金の読み取り/書き込み CU の料金は、予約済みの読み取り/書き込み CU の料金とは別です。インスタンスタイプによって、従量課金 CU または予約済み CU のどちらが消費されるかが決まります。
データの読み取りは読み取りキャパシティユニット (RCU) を消費しますが、書き込みキャパシティユニット (WCU) は消費しません。消費される RCU は次のように計算されます。
-
GetRow 操作によって消費される RCU
消費される RCU の数は、読み取られたデータの合計サイズに基づきます。これは、プライマリキーのデータサイズと取得された属性列のデータサイズの合計です。この合計サイズを 4 KB で除算し、最も近い整数に切り上げます。指定された行が存在しない場合、操作は 1 RCU を消費します。
-
BatchGetRow 操作によって消費される RCU
BatchGetRow 操作の RCU は、各 RowInBatchGetRowRequest を個別の GetRow 操作として扱うことで計算されます。
-
GetRange 操作によって消費される RCU
消費される RCU の数は、スキャンされたすべてのデータの合計サイズに基づきます。これは、範囲内のすべての行のプライマリキーのデータサイズとスキャンされた属性列のデータサイズの合計です。この合計サイズを 4 KB で除算し、最も近い整数に切り上げます。たとえば、スキャンが 10 行をカバーし、各行のプライマリキーとスキャンされた属性列の合計サイズが 330 バイトの場合、合計データサイズは 3.3 KB (10 行 × 330 バイト) です。この操作は 1 RCU を消費します。