Tablestore は、データテーブルからデータを読み取るために呼び出すことができるさまざまな操作を提供します。たとえば、単一のデータ行の読み取り、複数のデータ行の同時読み取り、主キー値が指定された範囲内にあるデータの読み取り、イテレータを使用したデータの読み取り、データの同時読み取りを実行できます。
クエリメソッド
Tablestore は、データを読み取るために呼び出すことができる GetRow、BatchGetRow、および GetRange 操作を提供します。データを読み取る前に、実際のクエリシナリオに基づいて適切なクエリメソッドを選択してください。
自動採番主キー列を含むテーブルからデータを読み取る場合は、自動採番主キー列を含むすべての主キー列の値を取得していることを確認してください。詳細については、「自動採番主キー列を構成する」をご参照ください。自動採番主キー列に値が記録されていない場合は、GetRange 操作を呼び出して、最初の主キー列の値に基づいて読み取るデータの主キー範囲を決定できます。
メソッド | 説明 | シナリオ |
GetRow 操作を呼び出して、単一のデータ行を読み取ることができます。 | このメソッドは、読み取る行のすべての主キー列の値を決定でき、読み取る行数が少ないシナリオに適しています。 | |
BatchGetRow 操作を呼び出して、1 つ以上のテーブルから複数のデータ行を同時に読み取ることができます。 BatchGetRow 操作は、複数の GetRow 操作で構成されています。 BatchGetRow 操作を呼び出す場合、各 GetRow 操作を構築するプロセスは、GetRow 操作を呼び出す場合の GetRow 操作を構築するプロセスと同じです。 | この操作は、読み取る行のすべての主キー列の値を決定でき、読み取る行数が多い場合、または複数のテーブルからデータを読み取る場合に適しています。 | |
GetRange 操作を呼び出して、主キー値が指定された範囲内にあるデータを読み取ることができます。 GetRange 操作を使用すると、主キー値が指定された範囲内にあるデータを前方または後方に読み取ることができます。また、読み取る行数を指定することもできます。範囲が広く、スキャンされた行数またはスキャンされたデータの量が上限を超えると、スキャンは停止し、読み取られた行と次の行の主キーに関する情報が返されます。最後の操作が中断された位置から開始するリクエストを開始し、前の操作によって返された次の行の主キーに関する情報に基づいて残りの行を読み取ることができます。 | このメソッドは、読み取る行の主キー値の範囲または主キー値のプレフィックスを決定できるシナリオに適しています。 重要 読み取る行の主キー値のプレフィックスを決定できない場合は、開始主キーを INF_MIN に、終了主キーを INF_MAX に設定して、テーブル内のすべてのデータをスキャンできます。これにより、大量の計算リソースが消費されます。注意して進めてください。 | |
createRangeIterator 操作を呼び出して、イテレータを使用して主キー値が指定された範囲内にあるデータを読み取ることができます。 | このメソッドは、読み取る行の主キー値の範囲または主キー値のプレフィックスを決定でき、データを読み取るためにイテレータが必要なシナリオに適しています。 | |
Tablestore SDK for Java は、BatchGetRow 操作をカプセル化する TableStoreReader クラスを提供します。このクラスを使用して、データテーブル内のデータを同時にクエリできます。 TableStoreReader は、マルチテーブルクエリ、クエリステータスの統計、行レベルのコールバック、およびカスタム構成もサポートしています。 | この操作は、読み取る行のすべての主キー列の値を決定でき、読み取る行数が多い場合、または複数のテーブルからデータを読み取る場合に適しています。 |
前提条件
OTSClient インスタンスが初期化されています。詳細については、「クライアントを初期化する」をご参照ください。
データテーブルが作成され、データがデータテーブルに書き込まれます。
単一のデータ行を読み取る
GetRow 操作を呼び出して、単一のデータ行を読み取ることができます。 GetRow 操作を呼び出すと、次のいずれかの結果が返される場合があります。
行が存在する場合、行の主キー列と属性列が返されます。
行が存在しない場合、行は返されず、エラーも報告されません。
パラメータ
パラメータ | 説明 |
tableName | データテーブルの名前。 |
primaryKey | 行の主キー。このパラメータの値は、各主キー列の名前、タイプ、および値で構成されます。 重要 指定する主キー列の数とタイプは、データテーブル内の実際の主キー列の数とタイプと同じである必要があります。 |
columnsToGet | 返す列。主キー列または属性列の名前を指定できます。
説明
|
maxVersions | 返すことができるデータバージョンの最大数。 重要 次のパラメータの少なくとも 1 つを構成する必要があります。maxVersions および timeRange。
|
timeRange | 返すバージョン範囲または特定のバージョン。詳細については、「TimeRange」をご参照ください。 重要 次のパラメータの少なくとも 1 つを構成する必要があります。maxVersions および timeRange。
タイムスタンプと 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("<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();
// テーブル名と主キーを指定して、データの行を読み取ります。
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);
}複数のデータ行を同時に読み取る
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 行を同時に読み取ることができます。
パラメーター
詳細については、このトピックの1 つのデータ行を読み取るためのパラメーターセクションをご参照ください。
例
次のサンプルコードは、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());
}
}詳細なサンプルコードについては、BatchGetRow@ GitHub をご覧ください。
プライマリキー値が指定された範囲内にあるデータを読み取る
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 | 返すことができるデータバージョンの最大数。 重要 maxVersions と timeRange の少なくともいずれかのパラメーターを設定する必要があります。
|
timeRange | 返すバージョンの範囲、または特定のバージョン。 詳細については、「TimeRange」をご参照ください。 重要 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("<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;
}
}
} プライマリキー値が指定された範囲内にあるデータを読み取り、正規表現を使用して指定された列のデータをフィルタリングする
次のサンプルコードは、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;
}
}
}詳細なサンプルコードについては、「GetRange@ GitHub」をご参照ください。
イテレータを使用して、プライマリキー値が指定された範囲内にあるデータを読み取る
次のサンプルコードは、イテレータを使用して、プライマリキー値が指定された範囲内にあるデータを読み取るために、createRangeIterator 操作を呼び出す方法の例を示しています。
private static void getRangeByIterator(SyncClient client, String startPkValue, String endPkValue) {
// データテーブルの名前を指定します。
RangeIteratorParameter rangeIteratorParameter = new RangeIteratorParameter("<TABLE_NAME>");
// 開始プライマリキーを指定します。
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);
}
} 詳細なサンプルコードについては、「GetRangeByIterator@ GitHub」をご参照ください。
データの同時読み取り
Tablestore SDK for Java は、BatchGetRow 操作をカプセル化する TableStoreReader クラスを提供します。 このクラスを使用すると、データテーブルのデータを同時にクエリできます。 TableStoreReader は、マルチテーブルクエリ、クエリステータスの統計、行レベルのコールバック、およびカスタム構成もサポートしています。
TableStoreReader は、Tablestore SDK for Java V5.16.1 以降でサポートされています。 有効な SDK バージョンを使用していることを確認してください。 Tablestore SDK for Java のバージョン履歴については、「Tablestore SDK for Java のバージョン履歴」をご参照ください。
はじめに
TableStoreReader を構築します。
// インスタンス名を指定します。 String instanceName = "yourInstanceName"; // インスタンスのエンドポイントを指定します。 String endpoint = "yourEndpoint"; // 環境変数から AccessKey ID と AccessKey シークレットを取得します。 String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID"); String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET"); 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("<TABLE_NAME1>", pk1); // List メソッドを使用して、複数のプライマリキー値を同時に追加して、行をクエリすることもできます。 List<PrimaryKey> primaryKeyList = new ArrayList<PrimaryKey>(); Future<ReaderResult> readerResult = reader.addPrimaryKeysWithFuture("<TABLE_NAME2>", 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(); // ビジネス要件に基づいて、クライアントとエグゼキュータを閉じます。 client.shutdown(); executor.shutdown();
パラメーター
TableStoreReaderConfig を変更して、TableStoreReader のカスタム構成を指定できます。
パラメーター | 説明 |
checkTableMeta | クエリする行のプライマリキー値を追加するときに、テーブルのスキーマを確認するかどうかを指定します。 デフォルト値: true。 クエリする行のプライマリキー値を追加するときにテーブルのスキーマを確認しない場合は、このパラメーターを false に設定します。 |
bucketCount | TableStoreReader のメモリ内のキャッシュバケットの数。 デフォルト値: 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("<TABLE_NAME>");
// 返す列を指定します。
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 instanceName = "yourInstanceName";
// インスタンスのエンドポイントを指定します。
private static final String endpoint = "yourEndpoint";
// 環境変数から AccessKey ID と AccessKey シークレットを取得します。
private static final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
private static final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
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);
// TableStoreReader の構成クラスを構築します。
TableStoreReaderConfig config = new TableStoreReaderConfig();
{
// 以下のパラメーターにはデフォルト値があり、空のままにすることができます。
// クエリする行のプライマリキー値を追加する前に、テーブルのスキーマを確認します。
config.setCheckTableMeta(true);
// リクエストを使用してクエリできる行の最大数を指定します。 この例では、リクエストを使用して最大 100 行をクエリできます。
config.setMaxBatchRowsCount(100);
// 返されるバージョンの最大数を指定します。
config.setDefaultMaxVersions(1);
// 送信できる同時リクエストの総数。
config.setConcurrency(16);
// メモリ内のバケットの数を指定します。
config.setBucketCount(4);
// キャッシュされたすべてのデータがフラッシュされる間隔を指定します。
config.setFlushInterval(10000);
// TableStoreReader のステータスが記録される間隔を指定します。
config.setLogInterval(10000);
}
// リクエストの送信に使用するエグゼキュータを構築します。
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());
// TableStoreReader のコールバック関数を構築します。
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("<TABLE_NAME1>", pk1);
// クエリする別の行のプライマリキー値をメモリに追加し、Future オブジェクトを取得します。
PrimaryKey pk2 = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromLong(0))
.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(0))
.build();
Future<ReaderResult> readerResult = reader.addPrimaryKeyWithFuture("<TABLE_NAME2>", 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();
}
}参照資料
インデックスを使用してデータクエリを高速化する場合、セカンダリインデックスまたはサーチインデックス機能を使用できます。詳細については、「セカンダリインデックス」または「サーチインデックス」をご参照ください。
テーブルのデータを可視化する場合、テーブルを DataV または Grafana に接続できます。詳細については、「データの可視化」をご参照ください。
テーブルからローカルファイルにデータをダウンロードする場合、DataX または Tablestore CLI を使用できます。詳細については、「Tablestore のデータをローカルファイルにダウンロードする」をご参照ください。
テーブルのデータを計算および分析する場合、Tablestore の SQL クエリ機能を使用できます。詳細については、「SQL クエリ」をご参照ください。
説明MaxCompute、Spark、Hive、HadoopMR、Function Compute、Flink などのコンピュートエンジンを使用して、テーブルのデータを計算および分析することもできます。詳細については、「概要」をご参照ください。