Tablestore SDK for Java の bulkExport API を使用して、データテーブル内の連続した行範囲をスキャンします。1 回の呼び出しで、プライマリキー範囲 (左閉右開) に基づいて複数行を返し、指定したカラム、サーバー側フィルター、データブロックのエンコーディングをサポートします。ページネーションと組み合わせることで、テーブル全体をスキャンできます。
前提条件
Tablestore SDK for Java をインストールし、クライアントを初期化します。
機能の説明
public BulkExportResponse bulkExport(BulkExportRequest bulkExportRequest) throws TableStoreException, ClientException
プライマリキー範囲に基づいて、データテーブルから連続した行をスキャンします。レスポンスには、開始キー以上かつ終了キー未満のプライマリキーを持つ行が含まれます。BulkExportQueryCriteria (com.alicloud.openservices.tablestore.model.tunnel サブパッケージ) を使用して、開始および終了のプライマリキー、返すカラム、フィルター、データブロックのエンコードタイプを設定します。レスポンスは行データを ByteBuffer でエンコードされたバイト列として返します。対応するパーサーでデコードして行リストに変換します。DBT_PLAIN_BUFFER には PlainBufferBlockParser を、DBT_SIMPLE_ROW_MATRIX には SimpleRowMatrixBlockParser を使用します。getNextStartPrimaryKey() が null でない場合は、まだ行が残っています。そのキーからスキャンを継続します。
次の例では、bulk_export_demo テーブルから、プライマリキー範囲 [row00, row99) で 1 回の呼び出しで読み取ります。DBT_PLAIN_BUFFER エンコーディングを使用し、対応するパーサーで結果をデコードします。
String tableName = "bulk_export_demo";
// 開始プライマリキー (含む)
PrimaryKey startPk = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("row00"))
.build();
// 終了プライマリキー (含まない)
PrimaryKey endPk = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("row99"))
.build();
// BulkExportQueryCriteria は model.tunnel サブパッケージにあります
BulkExportQueryCriteria criteria = new BulkExportQueryCriteria(tableName);
criteria.setInclusiveStartPrimaryKey(startPk);
criteria.setExclusiveEndPrimaryKey(endPk);
criteria.setDataBlockType(DataBlockType.DBT_PLAIN_BUFFER);
criteria.addColumnsToGet("pk");
criteria.addColumnsToGet("col1");
BulkExportRequest request = new BulkExportRequest(criteria);
BulkExportResponse response = client.bulkExport(request);
// response.getRows() は ByteBuffer を返します。対応するパーサーを使用して List にパースします
// DBT_PLAIN_BUFFER -> PlainBufferBlockParser
// DBT_SIMPLE_ROW_MATRIX -> SimpleRowMatrixBlockParser
PlainBufferBlockParser parser = new PlainBufferBlockParser(response.getRows());
List<Row> rows = parser.getRows();
System.out.println("Rows returned: " + rows.size());
for (Row row : rows) {
System.out.println(row);
}
// nextStartPrimaryKey が null でない場合は、まだデータが残っているためページネーションを継続する必要があります
System.out.println("Has next: " + (response.getNextStartPrimaryKey() != null));
主要パラメータ:
-
tableName(必須):データテーブルの名前です。 -
inclusiveStartPrimaryKey/exclusiveEndPrimaryKey(必須):スキャン範囲の開始および終了のプライマリキーです。左閉右開です。 -
dataBlockType(任意):レスポンスのデータブロックのエンコーディングです。結果のデコードに使用するパーサーと一致させる必要があります。 -
columnsToGet/filter(任意):返すカラムとサーバー側フィルター条件です。
パラメータ
|
名前 |
タイプ |
説明 |
|
tableName (必須) |
String |
データテーブルの名前です。 |
|
inclusiveStartPrimaryKey (必須) |
PrimaryKey |
スキャン範囲の開始プライマリキーです。このキーを持つ行が存在する場合、その行はレスポンスに含まれます。 有効なプライマリキー、または |
|
exclusiveEndPrimaryKey (必須) |
PrimaryKey |
スキャン範囲の終了プライマリキーです。このキーを持つ行は、存在するかどうかに関係なく、レスポンスに含まれません。 有効なプライマリキー、または |
|
columnsToGet (任意) |
Set<String> |
返すカラム名のセットです。指定しない場合、各行のすべてのカラムが返されます。 指定した場合、レスポンスには各行に存在する指定したカラムのみが含まれます。行に指定したカラムが 1 つも存在しない場合、その行はレスポンスから除外されます。 |
|
filter (任意) |
Filter |
カラム選択の後に適用されるサーバー側フィルターです。 |
|
dataBlockType (任意) |
DataBlockType |
レスポンスのデータブロックのエンコーディングです。有効な値: |
シナリオ例
nextStartPrimaryKey を使用したテーブル全体のページネーション
1 回の bulkExport 呼び出しでは、範囲の一部しか返されないことがよくあります。テーブル全体をスキャンするには、各レスポンスの nextStartPrimaryKey を次の呼び出しの開始プライマリキーとして渡します。nextStartPrimaryKey が null になったら停止します。
String tableName = "bulk_export_demo";
PrimaryKey startPk = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("row00"))
.build();
PrimaryKey endPk = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("row99"))
.build();
int totalRows = 0;
while (startPk != null) {
BulkExportQueryCriteria criteria = new BulkExportQueryCriteria(tableName);
criteria.setInclusiveStartPrimaryKey(startPk);
criteria.setExclusiveEndPrimaryKey(endPk);
criteria.setDataBlockType(DataBlockType.DBT_PLAIN_BUFFER);
BulkExportResponse response = client.bulkExport(new BulkExportRequest(criteria));
PlainBufferBlockParser parser = new PlainBufferBlockParser(response.getRows());
List<Row> rows = parser.getRows();
totalRows += rows.size();
// nextStartPrimaryKey が null の場合、すべてのデータを読み取り済みです
startPk = response.getNextStartPrimaryKey();
}
System.out.println("Total rows scanned: " + totalRows);