Varra intervalos contíguos de linhas em uma tabela de dados com bulkExport no Tablestore SDK for Java. Uma única chamada retorna várias linhas por intervalo de chave primária (inclusivo à esquerda, exclusivo à direita) e oferece suporte a colunas selecionadas, filtros no servidor e codificações de bloco de dados. Combine esse recurso com paginação para varrer uma tabela inteira.
Pré-requisitos
Instale o Tablestore SDK for Java e inicialize o cliente.
Descrição do recurso
public BulkExportResponse bulkExport(BulkExportRequest bulkExportRequest) throws TableStoreException, ClientException
Esse método varre linhas contíguas de uma tabela de dados por intervalo de chave primária. A resposta inclui linhas cujas chaves primárias são maiores ou iguais à chave inicial e menores que a chave final. Use BulkExportQueryCriteria (no subpacote com.alicloud.openservices.tablestore.model.tunnel) para definir as chaves primárias inicial e final, as colunas a retornar, o filtro e o tipo de codificação do bloco de dados. A resposta retorna os dados das linhas como bytes codificados em ByteBuffer. Decodifique-os em uma lista de linhas com o parser correspondente: DBT_PLAIN_BUFFER usa PlainBufferBlockParser; DBT_SIMPLE_ROW_MATRIX usa SimpleRowMatrixBlockParser. Se getNextStartPrimaryKey() retornar um valor diferente de null, ainda há mais linhas. Continue a varredura a partir dessa chave.
O exemplo a seguir lê da tabela bulk_export_demo no intervalo de chave primária [row00, row99) em uma única chamada. Ele usa a codificação DBT_PLAIN_BUFFER e decodifica o resultado com o parser correspondente.
String tableName = "bulk_export_demo";
// Start primary key (inclusive)
PrimaryKey startPk = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("row00"))
.build();
// End primary key (exclusive)
PrimaryKey endPk = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("row99"))
.build();
// BulkExportQueryCriteria is located in the model.tunnel subpackage
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() returns a ByteBuffer; parse it into List<Row> using the corresponding parser
// 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);
}
// A non-null nextStartPrimaryKey indicates that more data remains and pagination must continue
System.out.println("Has next: " + (response.getNextStartPrimaryKey() != null));
Parâmetros principais:
tableName(obrigatório): nome da tabela de dados.inclusiveStartPrimaryKey/exclusiveEndPrimaryKey(obrigatório): chaves primárias inicial e final do intervalo de varredura (inclusiva e exclusiva, respectivamente).dataBlockType(opcional): codificação do bloco de dados da resposta. Deve corresponder ao parser usado para decodificar o resultado.columnsToGet/filter(opcional): colunas a retornar e condição de filtro no servidor.
Parâmetros
|
Nome |
Tipo |
Descrição |
|
tableName (obrigatório) |
String |
Nome da tabela de dados. |
|
inclusiveStartPrimaryKey (obrigatório) |
PrimaryKey |
Chave primária inicial do intervalo de varredura. Se existir uma linha com essa chave, ela será incluída na resposta. Aceita uma chave primária válida ou um ponto virtual construído com |
|
exclusiveEndPrimaryKey (obrigatório) |
PrimaryKey |
Chave primária final do intervalo de varredura. A linha com essa chave nunca é incluída na resposta, independentemente de sua existência. Aceita uma chave primária válida ou um ponto virtual construído com |
|
columnsToGet (opcional) |
Set<String> |
Conjunto de nomes de colunas a retornar. Se não definido, todas as colunas de cada linha serão retornadas. Quando definido, a resposta inclui apenas as colunas existentes de cada linha. Se uma linha não contiver nenhuma das colunas especificadas, a resposta exclui essa linha. |
|
filter (opcional) |
Filter |
Filtro no servidor aplicado após a seleção de colunas. Se você especificar |
|
dataBlockType (opcional) |
DataBlockType |
Codificação do bloco de dados da resposta. Valores válidos: |
Exemplos de cenários
Paginar a tabela inteira com nextStartPrimaryKey
Uma única chamada de bulkExport geralmente retorna apenas parte do intervalo. Para varrer a tabela inteira, passe o nextStartPrimaryKey de cada resposta como chave primária inicial da próxima chamada. Interrompa quando nextStartPrimaryKey for 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();
// A null nextStartPrimaryKey indicates that all data has been read
startPk = response.getNextStartPrimaryKey();
}
System.out.println("Total rows scanned: " + totalRows);