Tablestore は、テーブルからデータを読み取るための複数の操作を提供します。具体的には、単一のデータ行の読み取り、一度に複数のデータ行の読み取り、指定された範囲内のプライマリキー値を持つデータの読み取り、イテレータを使用したデータの読み取り、並列クエリでのデータの読み取りが可能です。
クエリメソッド
Tablestore は、データを読み取るために呼び出すことができる GetRow、BatchGetRow、および GetRange 操作を提供します。データを読み取る前に、実際のクエリシナリオに基づいて適切なクエリメソッドを選択してください。
自動インクリメントプライマリキー列を含むテーブルからデータを読み取る場合は、自動インクリメントプライマリキー列の値を含むすべてのプライマリキー列の値をクエリしたことを確認してください。詳細については、自動インクリメントプライマリキー列の設定を参照してください。自動インクリメントプライマリキー列に値が記録されていない場合は、GetRange 操作を呼び出して、最初のプライマリキー列のプライマリキー値に基づいてデータが読み取られる範囲を指定できます。
クエリメソッド | 説明 | シナリオ |
GetRow 操作を呼び出して、単一のデータ行を読み取ることができます。 | このメソッドは、テーブルのすべてのプライマリキー列を決定でき、読み取る行数が少ないシナリオに適用できます。 | |
BatchGetRow 操作を呼び出して、1 つ以上のテーブルから一度に複数のデータ行を読み取ることができます。 BatchGetRow 操作は、複数の GetRow 操作で構成されます。 BatchGetRow 操作を呼び出す場合、各 GetRow 操作を構築するプロセスは、GetRow 操作を呼び出す場合の GetRow 操作を構築するプロセスと同じです。 | このメソッドは、テーブルのすべてのプライマリキー列を決定でき、読み取る行数が多く、または複数のテーブルからデータを読み取るシナリオに適用できます。 | |
GetRange 操作を呼び出して、指定された範囲内のプライマリキー値を持つデータを読み取ることができます。 GetRange 操作を使用すると、指定された範囲内のプライマリキー値を持つデータを前方または後方に読み取ることができます。読み取る行数を指定することもできます。範囲が広く、スキャンされた行数またはスキャンされたデータの量が上限を超えると、スキャンは停止し、読み取られた行と次の行のプライマリキーに関する情報が返されます。前回の操作が中断したところから開始するリクエストを開始し、前回の操作によって返された次の行のプライマリキーに関する情報に基づいて残りの行を読み取ることができます。 | このメソッドは、テーブルのすべてのプライマリキー列の範囲またはプライマリキー列のプレフィックスを決定できるシナリオに適用できます。 重要 プライマリキー列のプレフィックスを決定できない場合は、データが INF_MIN タイプの開始プライマリキー列とデータが INF_MAX タイプの終了プライマリキー列を指定して、テーブルのすべてのプライマリキー列の範囲を決定できます。この操作はテーブル内のすべてのデータをスキャンしますが、大量の計算リソースを消費します。注意して進めてください。 | |
createRangeIterator 操作を呼び出して、イテレータを使用して指定された範囲内のプライマリキー値を持つデータを読み取ることができます。 | このメソッドは、テーブルのすべてのプライマリキー列の範囲またはプライマリキー列のプレフィックスを決定でき、データを読み取るためにイテレータが必要なシナリオに適用できます。 | |
Tablestore Java SDK は、BatchGetRow 操作をカプセル化する TableStoreReader クラスを提供します。このクラスを使用して、データテーブルのデータを同時にクエリできます。 TableStoreReader は、マルチテーブルクエリ、クエリステータスの統計、行レベルのコールバック、およびカスタム設定もサポートしています。 | このメソッドは、テーブルのすべてのプライマリキー列を決定でき、読み取る行数が多く、または複数のテーブルからデータを読み取るシナリオに適用できます。 |
前提条件
OTSClient インスタンスが初期化されています。詳細については、クライアントの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれます。
単一のデータ行の読み取り
GetRow 操作を呼び出して、単一のデータ行を読み取ることができます。 GetRow 操作を呼び出すと、次のいずれかの結果が返される場合があります。
行が存在する場合、行のプライマリキー列と属性列が返されます。
行が存在しない場合、行は返されず、エラーも報告されません。
パラメータ
パラメータ | 説明 |
tableName | データテーブルの名前。 |
primaryKey | 行のプライマリキー情報。このパラメータの値には、各プライマリキー列の名前、プライマリキー列のタイプ、およびプライマリキー値が含まれます。 重要 指定するプライマリキー列の数とタイプは、データテーブルの実際のプライマリキー列の数とタイプと同じである必要があります。 |
columnsToGet | 読み取る列。プライマリキー列または属性列の名前を指定できます。
説明
|
maxVersions | 読み取ることができるデータバージョンの最大数。 重要 次のパラメータの少なくとも 1 つを設定する必要があります。maxVersions と timeRange。
|
timeRange | 読み取るバージョンの範囲または特定のバージョン。詳細については、TimeRangeを参照してください。 重要 次のパラメータの少なくとも 1 つを設定する必要があります。maxVersions と timeRange。
timestamp と timeRange パラメータの有効な値:0 から |
filter | サーバー側でクエリ結果をフィルタリングするために使用するフィルター。フィルター条件を満たす行のみが返されます。詳細については、フィルターの設定を参照してください。 説明 columnsToGet パラメータと filter パラメータを設定すると、Tablestore は columnsToGet パラメータで指定された列をクエリし、フィルター条件を満たす行を返します。 |
サンプルコード
データバージョンと読み取る列を指定し、フィルターまたは正規表現を使用してデータをフィルタリングできます。
行の指定された列から最新バージョンのデータを読み取る
次のサンプルコードは、データテーブルの行の指定された列から最新バージョンのデータを読み取る方法の例を示しています。
private static void getRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブル名とプライマリキーを指定して、データの行を読み取ります。
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<テーブル名>", 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();
// テーブル名とプライマリキーを指定して、データの行を読み取ります。
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<テーブル名>", 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("<テーブル名>");
// プライマリキーを構築します。
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);
}
一度に複数のデータ行を読み取る
BatchGetRow 操作を呼び出して、1 つ以上のテーブルから一度に複数のデータ行を読み取ることができます。 BatchGetRow 操作は、複数の GetRow 操作で構成されます。 BatchGetRow 操作を呼び出す場合、各 GetRow 操作を構築するプロセスは、GetRow 操作を呼び出す場合の GetRow 操作を構築するプロセスと同じです。
BatchGetRow 操作を呼び出すと、各 GetRow 操作は個別に実行され、Tablestore は各 GetRow 操作への応答を個別に返します。
使用上の注意
BatchGetRow 操作は、すべての行で同じパラメータ設定を使用します。たとえば、ColumnsToGet パラメータが [colA] に設定されている場合、colA 列の値のみがすべての行から読み取られます。
BatchGetRow 操作を呼び出して一度に複数の行を読み取ると、一部の行の読み取りに失敗する場合があります。この場合、Tablestore は例外を返さず、失敗した行のエラーメッセージが含まれる BatchGetRowResponse を返します。したがって、BatchGetRow 操作を呼び出すときは、戻り値を確認する必要があります。 BatchGetRowResponse の isAllSucceed メソッドを使用してすべての行が読み取られたかどうかを確認するか、BatchGetRowResponse の getFailedRows メソッドを使用して失敗した行に関する情報を取得できます。
BatchGetRow 操作を呼び出して、一度に最大 100 行を読み取ることができます。
パラメータ
詳細については、このトピックのパラメータセクションを参照してください。
サンプルコード
次のサンプルコードは、バージョン条件、読み取る列、およびフィルターを設定して 10 行のデータを読み取る方法の例を示しています。
private static void batchGetRow(SyncClient client) {
// データテーブルの名前を指定します。
MultiRowQueryCriteria multiRowQueryCriteria = new MultiRowQueryCriteria("<テーブル名>");
// 読み取る 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());
}
}
詳細なサンプルコードについては、GitHub のBatchGetRowにアクセスしてください。
特定の範囲内のプライマリキー値を持つデータを読み取る
GetRange 操作を呼び出して、指定された範囲内のプライマリキー値を持つデータを読み取ることができます。
GetRange 操作を使用すると、指定された範囲内のプライマリキー値を持つデータを前方または後方に読み取ることができます。読み取る行数を指定することもできます。範囲が広く、スキャンされた行数またはスキャンされたデータの量が上限を超えると、スキャンは停止し、読み取られた行と次の行のプライマリキーに関する情報が返されます。前回の操作が中断したところから開始するリクエストを開始し、前回の操作によって返された次の行のプライマリキーに関する情報に基づいて残りの行を読み取ることができます。
Tablestore テーブルでは、すべての行はプライマリキーでソートされます。テーブルのプライマリキーは、すべてのプライマリキー列で順番に構成されます。したがって、行は特定のプライマリキー列に基づいてソートされません。
使用上の注意
GetRange 操作は、左端一致の原則に従います。 Tablestore は、最初のプライマリキー列から最後のプライマリキー列まで順番に値を比較して、指定された範囲内のプライマリキー値を持つデータを読み取ります。たとえば、データテーブルのプライマリキーは、PK1、PK2、および PK3 というプライマリキー列で構成されます。データを読み取るとき、Tablestore は最初に、行の PK1 値が最初のプライマリキー列に指定された範囲内にあるかどうかを判断します。行の PK1 値が範囲内にある場合、Tablestore は、行の他のプライマリキー列の値が各プライマリキー列に指定された範囲内にあるかどうかの判断を停止し、行を返します。行の PK1 値が範囲内にない場合、Tablestore は、PK1 と同じ方法で、行の他のプライマリキー列の値が各プライマリキー列に指定された範囲内にあるかどうかを判断し続けます。
次のいずれかの条件が満たされると、GetRange 操作が停止してデータが返される場合があります。
スキャンされたデータ量が 4 MB に達する。
スキャンされた行数が 5,000 に達する。
返された行数が上限に達する。
予約済みの読み取りスループットがすべて消費されているため、読み取りスループットが次のデータ行を読み取るのに不十分である。
各 GetRange 呼び出しはデータを 1 回スキャンします。 GetRange 操作を呼び出してスキャンするデータのサイズが大きい場合、スキャンされた行数が 5,000 に達するか、スキャンされたデータのサイズが 4 MB に達すると、スキャンは停止します。 Tablestore は、クエリ条件を満たす残りのデータを返しません。ページングメソッドを使用して、クエリ条件を満たす残りのデータを取得できます。
パラメータ
パラメータ | 説明 |
tableName | データテーブルの名前。 |
direction | 応答内の行をソートする順序。
たとえば、テーブルにA と B という 2 つのプライマリキー値があり、値 A は値 B よりも小さいとします。 direction パラメータを FORWARD に設定し、テーブルに |
inclusiveStartPrimaryKey | 読み取る範囲の開始プライマリキー情報と終了プライマリキー情報。開始プライマリキー列と終了プライマリキー列は、有効なプライマリキー列、またはデータが INF_MIN タイプと INF_MAX タイプの仮想列である必要があります。仮想列で指定された範囲の列数は、指定されたテーブルのプライマリキー列の数と同じである必要があります。 INF_MIN は無限に小さい値を示します。他のすべてのタイプの値は、INF_MIN タイプの値よりも大きくなります。 INF_MAX は無限に大きい値を示します。他のすべてのタイプの値は、INF_MAX タイプの値よりも小さくなります。
データテーブルの行は、プライマリキー値に基づいて昇順でソートされます。データを読み取るために使用される範囲は、左閉右開区間です。データが順方向に読み取られる場合、プライマリキー値が開始プライマリキー値以上で終了プライマリキー値未満の行が返されます。 |
exclusiveEndPrimaryKey | |
limit | 返される行の最大数。このパラメータの値は 0 より大きい必要があります。 Tablestore は、順方向または逆方向に返される行の最大数に達すると、指定された範囲内の一部の行が返されない場合でも、操作を停止します。応答で返される nextStartPrimaryKey パラメータの値を使用して、次のリクエストでデータを読み取ることができます。 |
columnsToGet | 読み取る列。プライマリキー列または属性列の名前を指定できます。
説明
|
maxVersions | 読み取ることができるデータバージョンの最大数。 重要 次のパラメータの少なくとも 1 つを設定する必要があります。maxVersions と timeRange。
|
timeRange | 読み取るバージョンの範囲または特定のバージョン。詳細については、TimeRangeを参照してください。 重要 次のパラメータの少なくとも 1 つを設定する必要があります。maxVersions と timeRange。
timestamp と timeRange パラメータの有効な値:0 から |
filter | サーバー側でクエリ結果をフィルタリングするために使用するフィルター。フィルター条件を満たす行のみが返されます。詳細については、フィルターの設定を参照してください。 説明 columnsToGet パラメータと filter パラメータを設定すると、Tablestore は columnsToGet パラメータで指定された列をクエリし、フィルター条件を満たす行を返します。 |
nextStartPrimaryKey | 次の読み取りリクエストの開始プライマリキー値。 nextStartPrimaryKey パラメータの値を使用して、すべてのデータが読み取られたかどうかを判断できます。
|
サンプルコード
指定された範囲内のプライマリキー値を持つデータを読み取る
次のサンプルコードは、指定された範囲内のプライマリキー値を持つデータを順方向に読み取る方法の例を示しています。応答で nextStartPrimaryKey パラメータの値が空の場合、指定された範囲内のプライマリキー値を持つすべてのデータが読み取られます。
private static void getRange(SyncClient client, String startPkValue, String endPkValue) {
// データテーブルの名前を指定します。
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<テーブル名>");
// 開始プライマリキーを指定します。
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("<テーブル名>");
// 開始プライマリキーを指定します。 この例では、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;
}
}
}
プライマリキー値が指定された範囲内にあるデータを読み取り、正規表現を使用して指定された列のデータをフィルタリングする
次のサンプルコードは、["pk:2020-01-01.log", "pk:2021-01-01.log")
の範囲内のプライマリキー値を持つデータを Col1 列から読み取り、正規表現を使用して Col1 列のデータをフィルタリングする方法の例を示しています。
private static void getRange(SyncClient client) {
// データテーブルの名前を指定します。
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria("<テーブル名>");
// 読み取るデータのプライマリキーの範囲として ["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;
}
}
}
詳細なサンプルコードについては、GitHub のGetRangeにアクセスしてください。
イテレータを使用して指定された範囲のプライマリキー値を持つデータを読み取る
次のサンプルコードは、createRangeIterator 操作を呼び出して、イテレータを使用して指定された範囲内のプライマリキー値を持つデータを読み取る方法の例を示しています。
private static void getRangeByIterator(SyncClient client, String startPkValue, String endPkValue) {
// データテーブルの名前を指定します。
RangeIteratorParameter rangeIteratorParameter = new RangeIteratorParameter("<テーブル名>");
// 開始プライマリキーを指定します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(startPkValue));
rangeIteratorParameter.setInclusiveStartPrimaryKey(primaryKeyBuilder.build());
// 終了プライマリキーを指定します。
primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(endPkValue));
rangeIteratorParameter.setExclusiveEndPrimaryKey(primaryKeyBuilder.build());
rangeIteratorParameter.setMaxVersions(1);
Iterator<Row> iterator = client.createRangeIterator(rangeIteratorParameter);
System.out.println("GetRange 操作でイテレータを使用した場合に取得された結果:");
while (iterator.hasNext()) {
Row row = iterator.next();
System.out.println(row);
}
}
詳細なサンプルコードについては、GitHub のGetRangeByIteratorにアクセスしてください。
並列クエリでデータを読み取る
Tablestore Java SDK は、BatchGetRow 操作をカプセル化する TableStoreReader クラスを提供します。このクラスを使用して、データテーブルのデータを同時にクエリできます。 TableStoreReader は、マルチテーブルクエリ、クエリステータスの統計、行レベルのコールバック、およびカスタム設定もサポートしています。
TableStoreReader は、Tablestore Java SDK V5.16.1 以降でサポートされています。有効な SDK バージョンを使用していることを確認してください。 Tablestore Java SDK のバージョン履歴の詳細については、Tablestore Java SDK のバージョン履歴を参照してください。
はじめに
TableStoreReader を構築します。
String endpoint = "<エンドポイント>"; String accessKeyId = System.getenv("OTS_AK_ENV"); String accessKeySecret = System.getenv("OTS_SK_ENV"); String instanceName = "<インスタンス名>"; AsyncClientInterface client = new AsyncClient(endpoint, accessKeyId, accessKeySecret, instanceName); TableStoreReaderConfig config = new TableStoreReaderConfig(); ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 4, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(1024)) TableStoreReader reader = new DefaultTableStoreReader(client, config, executor, null);
リクエストを構築します。
クエリするデータをメモリにキャッシュします。一度に 1 つ以上のデータエントリを追加できます。
PrimaryKey pk1 = PrimaryKeyBuilder.createPrimaryKeyBuilder() .addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromLong(0)) .addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(0)) .build(); // データをクエリする指定されたテーブルに pk1 という名前の属性列を追加します。 Future<ReaderResult> readerResult = reader.addPrimaryKeyWithFuture("<テーブル名1>", pk1); // List メソッドを使用して、一度に複数の列を追加することもできます。 List<PrimaryKey> primaryKeyList = new ArrayList<PrimaryKey>(); Future<ReaderResult> readerResult = reader.addPrimaryKeysWithFuture("<テーブル名2>", primaryKeyList);
データをクエリします。
リクエストを送信して、メモリにキャッシュされているデータをクエリします。ブロッキングモードまたは非ブロッキングモードでデータをクエリできます。
ブロッキングモードでデータをクエリする
reader.flush();
非ブロッキングモードでデータをクエリする
reader.send();
クエリの結果を取得します。
// 成功したクエリと失敗したクエリの情報を表示します。 for (RowReadResult success : readerResult.get().getSucceedRows()) { System.out.println(success.getRowResult()); } for (RowReadResult fail : readerResult.get().getFailedRows()) { System.out.println(fail.getRowResult()); }
TableStoreReader を閉じます。
reader.close(); 実際の要件に基づいて、クライアントと executor を閉じます。 client.shutdown(); executor.shutdown();
パラメータ
TableStoreReaderConfig
を変更することで、TableStoreReader の設定をカスタマイズできます。
パラメータ | 説明 |
checkTableMeta | クエリする行を追加するときにテーブルの構造を確認するかどうかを指定します。デフォルト値:true。 クエリする行を追加するときにテーブル構造を確認する必要がない場合は、このパラメータを false に設定します。 |
bucketCount | リーダーのメモリ内のキャッシュバケットの数。デフォルト値:4。 |
bufferSize | 各バケットの RingBuffer のサイズ。デフォルト値:1024。 |
concurrency | batchGetRow 操作で許可される最大同時実行数。デフォルト値:10。 |
maxBatchRowsCount | batchGetRow 操作を呼び出してクエリできる行の最大数。デフォルト値:100。最大値:100。 |
defaultMaxVersions | getRow 操作を呼び出してクエリできるデータバージョンの最大数。デフォルト値:1。 |
flushInterval | 自動キャッシュのフラッシュ操作が実行される間隔。デフォルト値:10000。単位:ミリ秒。 |
logInterval | タスクのステータスが自動的に出力される間隔。デフォルト値:10000。単位:ミリ秒。 |
クエリ条件を指定する
データバージョンの最大数、クエリする列、データをクエリする時間範囲など、データをクエリするためのテーブルレベルのパラメータを指定できます。
// 過去 60 秒以内に指定されたテーブルの col1 列にある最大 10 個のバージョンのデータをクエリします。
// データテーブルの名前を指定します。
RowQueryCriteria criteria = new RowQueryCriteria("<テーブル名>");
// 返す列を指定します。
criteria.addColumnsToGet("col1");
// 返すバージョンの最大数を指定します。
criteria.setMaxVersions(10);
criteria.setTimeRange(new TimeRange(System.currentTimeMillis() - 60 * 1000, System.currentTimeMillis()));
reader.setRowQueryCriteria(criteria);
サンプルコード
public class TableStoreReaderDemo {
private static final String endpoint = "<エンドポイント>";
private static final String accessKeyId = System.getenv("OTS_AK_ENV");
private static final String accessKeySecret = System.getenv("OTS_SK_ENV");
private static final String instanceName = "<インスタンス名>";
private static AsyncClientInterface client;
private static ExecutorService executor;
private static AtomicLong succeedRows = new AtomicLong();
private static AtomicLong failedRows = new AtomicLong();
public static void main(String[] args) throws ExecutionException, InterruptedException {
/**
* ステップ 1:TableStoreReader を構築します。
*/
// AsyncClient を構築します。
client = new AsyncClient(endpoint, accessKeyId, accessKeySecret, instanceName);
// リーダーの設定クラスを構築します。
TableStoreReaderConfig config = new TableStoreReaderConfig();
{
// 次のパラメータはデフォルトで使用できます。 これらのパラメータを設定する必要はありません。
// リーダーにクエリするデータを追加する前に、テーブルの構造を確認します。
config.setCheckTableMeta(true);
// リクエストでクエリできる行の最大数。 最大値は 100 です。
config.setMaxBatchRowsCount(100);
// 取得できる列バージョンのデフォルトの最大数。
config.setDefaultMaxVersions(1);
// 送信できる同時リクエストの総数。
config.setConcurrency(16);
// メモリ内のキャッシュバケットの数。
config.setBucketCount(4);
// キャッシュされたすべてのデータが送信される間隔。
config.setFlushInterval(10000);
// リーダーのステータスが記録される間隔。
config.setLogInterval(10000);
}
// リクエストを送信するために使用される executor を構築します。
ThreadFactory threadFactory = new ThreadFactory() {
private final AtomicInteger counter = new AtomicInteger(1);
@Override
public Thread newThread(Runnable r) {
return new Thread(r, "reader-" + counter.getAndIncrement());
}
};
executor = new ThreadPoolExecutor(4, 4, 0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue(1024), threadFactory, new ThreadPoolExecutor.CallerRunsPolicy());
// リーダーのコールバック関数を構築します。
TableStoreCallback<PrimaryKeyWithTable, RowReadResult> callback = new TableStoreCallback<PrimaryKeyWithTable, RowReadResult>() {
@Override
public void onCompleted(PrimaryKeyWithTable req, RowReadResult res) {
succeedRows.incrementAndGet();
}
@Override
public void onFailed(PrimaryKeyWithTable req, Exception ex) {
failedRows.incrementAndGet();
}
};
TableStoreReader reader = new DefaultTableStoreReader(client, config, executor, callback);
/**
* ステップ 2:リクエストを構築します。
*/
// クエリするデータの列をメモリに追加します。
PrimaryKey pk1 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromLong(0))
.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(0))
.build();
reader.addPrimaryKey("<テーブル名1>", pk1);
// クエリするデータの列をメモリに追加し、Future パラメータの応答を取得します。
PrimaryKey pk2 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromLong(0))
.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(0))
.build();
Future<ReaderResult> readerResult = reader.addPrimaryKeyWithFuture("<テーブル名2>", pk2);
/**
* ステップ 3:データをクエリします。
*/
// メモリからデータを非ブロッキングモードで送信します。
reader.send();
/**
* ステップ 4:クエリの結果を取得します。
*/
// 成功したクエリと失敗したクエリの情報を表示します。
for (RowReadResult success : readerResult.get().getSucceedRows()) {
System.out.println(success.getRowResult());
}
for (RowReadResult fail : readerResult.get().getFailedRows()) {
System.out.println(fail.getRowResult());
}
/**
* ステップ 5:TableStoreReader を閉じます。
*/
reader.close();
client.shutdown();
executor.shutdown();
}
}
関連情報
データクエリを高速化する場合、セカンダリインデックスまたは検索インデックスを使用できます。詳細については、セカンダリインデックスまたは検索インデックスを参照してください。
テーブルのデータを視覚化する場合は、Tablestore を DataV または Grafana に接続できます。詳細については、データの視覚化を参照してください。
テーブルからローカルファイルにデータをダウンロードする場合は、DataX または Tablestore CLI を使用できます。詳細については、Tablestore のデータをローカルファイルにダウンロードするを参照してください。
Tablestore のデータに対して計算または分析を実行する場合は、Tablestore の SQL クエリ機能を使用できます。詳細については、SQL クエリを参照してください。
説明MaxCompute、Spark、Hive、Hadoop MapReduce、Function Compute、Realtime Compute for Apache Flink などのコンピューティングエンジンを使用して、テーブル内のデータを計算および分析することもできます。詳細については、概要をご参照ください。