Utilice Tablestore SDK for Java para leer filas consecutivas de una tabla del modelo Wide Column dentro de un rango de clave primaria.
Requisitos previos
Instale Tablestore SDK for Java e inicialice el cliente.
Descripción
Llame a getRange para leer filas consecutivas en orden ascendente o descendente dentro de un rango de clave primaria. Puede especificar las columnas devueltas, el rango de versiones de datos y las condiciones de filtro.
public GetRangeResponse getRange(GetRangeRequest getRangeRequest) throws TableStoreException, ClientException
Una sola lectura por rango devuelve como máximo 5,000 filas o 4 MB de datos. Cuando se alcance cualquiera de estos límites, utilice nextStartPrimaryKey en la respuesta para continuar con la lectura.
El siguiente ejemplo realiza un escaneo ascendente en get_range_demo, lee todas las filas con una clave primaria mayor o igual que row1 y devuelve únicamente la versión más reciente de cada columna.
String tableName = "get_range_demo";
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria(tableName);
// Start primary key (inclusive)
PrimaryKeyBuilder startPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteria.setInclusiveStartPrimaryKey(startPkBuilder.build());
// End primary key (exclusive); INF_MAX denotes positive infinity
PrimaryKeyBuilder endPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
criteria.setExclusiveEndPrimaryKey(endPkBuilder.build());
criteria.setMaxVersions(1);
GetRangeResponse response = client.getRange(new GetRangeRequest(criteria));
for (Row row : response.getRows()) {
System.out.println(row);
}
Parámetros
GetRangeRequest contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
rangeRowQueryCriteria (obligatorio) |
|
Los criterios para la lectura de un rango de filas. |
|
transactionId (opcional) |
|
El ID de transacción local. Establezca este parámetro solo cuando lea datos dentro de una transacción local. Para obtener información sobre cómo obtener y utilizar el ID, consulte Use local transactions. |
Criterios de consulta por rango
rangeRowQueryCriteria es de tipo RangeRowQueryCriteria y contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
tableName (obligatorio) |
|
El nombre de la tabla. |
|
inclusiveStartPrimaryKey (obligatorio) |
|
La clave primaria inicial inclusiva. Para lecturas ascendentes, debe ser menor que la clave primaria final. Para lecturas descendentes, debe ser mayor que la clave primaria final. Su esquema debe coincidir con el esquema de la tabla. Utilice |
|
exclusiveEndPrimaryKey (obligatorio) |
|
La clave primaria final exclusiva. Su esquema debe coincidir con el esquema de la tabla. Utilice |
|
direction (opcional) |
|
La dirección de lectura. El valor predeterminado es |
|
maxVersions (opcional) |
|
El número máximo de versiones de datos que se devolverán para cada columna de atributo. Si hay más versiones coincidentes, Tablestore las devuelve de la más reciente a la más antigua. Establezca como mínimo uno de los parámetros |
|
timeRange (opcional) |
|
El rango de versiones de datos. Solo se devuelven las versiones comprendidas en dicho rango. Establezca como mínimo uno de los parámetros |
|
limit (opcional) |
|
El número máximo de filas que se devolverán en una sola llamada. El valor debe ser mayor que 0. Cuando se alcance el límite, utilice |
|
columnsToGet (opcional) |
|
Las columnas que se devolverán. Si no especifica este parámetro, se devuelve la fila completa. Si lo especifica, no se devolverán las filas que no contengan ninguna de las columnas indicadas. |
|
filter (opcional) |
|
La condición de filtro. Si especifica tanto Para obtener información sobre cómo configurar el filtro, consulte Use filters. |
Respuesta
GetRangeResponse contiene los siguientes campos específicos de la operación.
|
Campo |
Tipo |
Descripción |
|
|
|
Las filas devueltas en la llamada actual, obtenidas mediante |
|
|
|
La clave primaria inicial para la siguiente llamada, obtenida mediante |
Ejemplos de escenarios
Iteración paginada
nextStartPrimaryKey en la respuesta corresponde a la clave primaria inicial de la página siguiente. Llame a getRange en un bucle hasta que nextStartPrimaryKey sea nulo para escanear todas las filas coincidentes.
String tableName = "get_range_demo";
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria(tableName);
PrimaryKeyBuilder startPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MIN);
criteria.setInclusiveStartPrimaryKey(startPkBuilder.build());
PrimaryKeyBuilder endPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
criteria.setExclusiveEndPrimaryKey(endPkBuilder.build());
criteria.setMaxVersions(1);
int totalRows = 0;
while (true) {
GetRangeResponse response = client.getRange(new GetRangeRequest(criteria));
totalRows += response.getRows().size();
// The current response did not return all rows; use nextStartPrimaryKey to fetch the next page.
PrimaryKey nextStart = response.getNextStartPrimaryKey();
if (nextStart == null) {
break;
}
criteria.setInclusiveStartPrimaryKey(nextStart);
}
System.out.println("Total rows scanned: " + totalRows);
Escaneo descendente
Utilice setDirection(Direction.BACKWARD) para realizar un escaneo descendente. En este caso, la clave primaria inicial debe ser mayor que la clave primaria final.
String tableName = "get_range_demo";
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria(tableName);
criteria.setDirection(Direction.BACKWARD);
// For a reverse scan, the start primary key must be greater than the end primary key
PrimaryKeyBuilder startPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
criteria.setInclusiveStartPrimaryKey(startPkBuilder.build());
PrimaryKeyBuilder endPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("row1"));
criteria.setExclusiveEndPrimaryKey(endPkBuilder.build());
criteria.setMaxVersions(1);
GetRangeResponse response = client.getRange(new GetRangeRequest(criteria));
System.out.println("Rows (backward): " + response.getRows().size());
Filtrado condicional
Utilice setFilter para devolver únicamente las filas que cumplan con una condición de valor de columna.
String tableName = "get_range_demo";
RangeRowQueryCriteria criteria = new RangeRowQueryCriteria(tableName);
PrimaryKeyBuilder startPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
startPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MIN);
criteria.setInclusiveStartPrimaryKey(startPkBuilder.build());
PrimaryKeyBuilder endPkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
endPkBuilder.addPrimaryKeyColumn("id", PrimaryKeyValue.INF_MAX);
criteria.setExclusiveEndPrimaryKey(endPkBuilder.build());
criteria.setMaxVersions(1);
// Return only rows where col1 equals "val1"
SingleColumnValueFilter filter = new SingleColumnValueFilter(
"col1",
SingleColumnValueFilter.CompareOperator.EQUAL,
ColumnValue.fromString("val1"));
filter.setPassIfMissing(false);
criteria.setFilter(filter);
GetRangeResponse response = client.getRange(new GetRangeRequest(criteria));
System.out.println("Rows (filtered): " + response.getRows().size());