説明
テーブルの基本単位は行であり、プライマリキー列と属性列で構成されます。プライマリキー列は必須であり、すべての行で名前と型が同じである必要があります。属性列はオプションであり、各行で属性が異なる場合があります。詳細については、「ワイドテーブルモデル」をご参照ください。
注意事項
自動採番主キー列を持つテーブルからデータを読み取る場合、自動採番列の値を含む完全なプライマリキーを指定する必要があります。詳細については、「自動採番主キー列」をご参照ください。
重要
自動採番主キー列の値がわからない場合は、最初のプライマリキー列に対して範囲クエリを実行することでデータを読み取ることができます。
単一行データの読み取り
GetRow API を呼び出して、単一行のデータを読み取ることができます。この操作は、完全なプライマリキーがわかっており、少数の行のみを読み取る必要がある場合に便利です。
単一行を読み取る際、以下の条件でデータをフィルターできます。
-
デフォルトでは、すべての列が返されます。特定の列のみを返すように操作を設定することもできます。
-
フィルターを使用して、特定のフィルター条件を満たす行を返すように設定できます。詳細については、「フィルター」をご参照ください。
-
テーブルに複数のデータバージョンを設定している場合、読み取る最大バージョン数を指定できます。また、特定の時間範囲または特定のバージョン番号のデータを読み取ることもできます。データバージョンの詳細については、「データバージョンとライフサイクル」をご参照ください。
読み取り操作の結果は、次の 2 つの場合があります。
データの一括読み取り
BatchGetRow API を呼び出して、1 回のリクエストで複数の行を読み取るか、複数のテーブルから同時にデータを読み取ることができます。この操作は、完全なプライマリキーがわかっており、多数の行または複数のテーブルからデータを読み取る必要がある場合に便利です。
BatchGetRow 操作は、複数の GetRow サブ操作で構成されます。サブ操作の構築プロセスは、GetRow 操作と同じです。
データを一括で読み取る際、以下の条件でデータをフィルターできます。
-
1 回のリクエストで複数のテーブルからデータを読み取ることができます。
1 回のリクエストで最大 100 行を読み取ることができます。
-
デフォルトでは、すべての列が返されます。特定の列のみを返すように操作を設定することもできます。
一括読み取りのすべての行は、同じパラメータ条件を使用します。例えば、ColumnsToGet=[colA] は、指定されたすべての行に対して colA 列のみが取得されることを意味します。
-
フィルターを使用して、特定のフィルター条件を満たす行を取得できます。詳細については、「フィルター」をご参照ください。
-
テーブルに複数のデータバージョンを設定している場合、読み取る最大バージョン数を指定できます。また、特定の時間範囲または特定のバージョン番号のデータを読み取ることもできます。データバージョンの詳細については、「データバージョンとライフサイクル」をご参照ください。
BatchGetRow 操作のサブ操作は独立して実行され、Tablestore は各サブ操作の結果を返します。
範囲内のデータの読み取り
GetRange API を呼び出して、指定された範囲内のデータを読み取ることができます。この操作は、完全なプライマリキー範囲またはキープレフィックスを決定できる場合に便利です。
説明
Tablestore テーブルでは、すべての行がプライマリキーでソートされます。テーブルのプライマリキーは、すべてのプライマリキー列から順に構成されます。したがって、行は特定のプライマリキー列に基づいてソートされるわけではありません。
GetRange 操作は最左一致の原則に従います。Tablestore は、最初のプライマリキー列から最後のプライマリキー列まで順番に値を比較して、プライマリキー値が指定された範囲内にあるデータを読み取ります。例えば、データテーブルのプライマリキーが PK1、PK2、PK3 のプライマリキー列で構成されているとします。データを読み取る際、Tablestore はまず行の PK1 値が、指定された範囲内にあるかどうかを判定します。PK1 値が範囲内にない場合、その行は直ちに除外され、後続のプライマリキー列 (PK2、PK3) は評価されません。PK1 値が範囲内にある場合にのみ、Tablestore は次に PK2 の値をその指定範囲と比較します。この比較は、範囲クエリで定義されたプライマリキー列に対して順番に続行されます。
範囲内のデータを読み取る際、以下の条件でデータをフィルターできます。
-
キープレフィックスを指定し、他のプライマリキー列に仮想ポイント INF_MIN (無限小) と INF_MAX (無限大) を使用します。また、完全なプライマリキー範囲を指定してデータを読み取ることもできます。
重要
キープレフィックスを決定できない場合、プライマリキー範囲全体を INF_MIN から INF_MAX に設定することで、フルテーブルスキャンを実行できます。この操作は大量の計算リソースを消費します。注意して使用してください。
範囲が大きい場合、スキャンされた行数またはデータ量が一定の制限を超えると、スキャンは停止します。操作は取得した行と次のプライマリキーに関する情報を返します。返された次のプライマリキー情報を使用して、別のリクエストを開始し、範囲内の残りの行を取得できます。
次のいずれかの条件が満たされると、GetRange 操作が停止してデータが返される場合があります。
-
正順または逆順で指定された最大行数を読み取ることができます。例えば、正順で最大 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("読み取りが完了しました。結果:");
System.out.println(row);
// 読み取る列を指定します。
criteria.addColumnsToGet("Col0");
getRowResponse = client.getRow(new GetRowRequest(criteria));
row = getRowResponse.getRow();
System.out.println("読み取りが完了しました。結果:");
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("読み取りが完了しました。結果:");
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("読み取りが完了しました。結果:");
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("すべての操作が成功したかどうか:" + batchGetRowResponse.isAllSucceed());
System.out.println("読み取りが完了しました。結果:");
for (BatchGetRowResponse.RowResult rowResult : batchGetRowResponse.getSucceedRows()) {
System.out.println(rowResult.getRow());
}
if (!batchGetRowResponse.isAllSucceed()) {
for (BatchGetRowResponse.RowResult rowResult : batchGetRowResponse.getFailedRows()) {
System.out.println("失敗した行:" + batchGetRowRequest.getPrimaryKey(rowResult.getTableName(), rowResult.getIndex()));
System.out.println("失敗の原因:" + 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 の結果:");
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 の結果:");
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;
}
}
}
-
定義された範囲内のデータの読み取りと特定の列への正規表現フィルターの適用
次のサンプルコードは、Col1 列からプライマリキー値が ["pk:2020-01-01.log", "pk:2021-01-01.log") の範囲内にあるデータを読み取り、正規表現を使用して 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 を消費します。