Utilisez le SDK Tablestore pour Java afin de lire des lignes consécutives d'une table au modèle Wide Column dans une plage de clés primaires.
Prérequis
Installez le SDK Tablestore pour Java et initialisez le client.
Description
Appelez la méthode getRange pour lire des lignes consécutives dans l'ordre croissant ou décroissant au sein d'une plage de clés primaires. Vous pouvez spécifier les colonnes à renvoyer, la plage de versions de données ainsi que les conditions de filtrage.
public GetRangeResponse getRange(GetRangeRequest getRangeRequest) throws TableStoreException, ClientException
Une seule lecture par plage renvoie au maximum 5 000 lignes ou 4 Mo de données. Lorsque l'une de ces limites est atteinte, utilisez la valeur nextStartPrimaryKey présente dans la réponse pour poursuivre la lecture.
L'exemple suivant effectue un balayage vers l'avant sur la table get_range_demo. Il lit toutes les lignes dont la clé primaire est supérieure ou égale à row1 et ne renvoie que la dernière version de chaque colonne.
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);
}
Paramètres
L'objet GetRangeRequest contient les paramètres suivants.
|
Nom |
Type |
Description |
|
rangeRowQueryCriteria (obligatoire) |
|
Les critères de lecture d'une plage de lignes. |
|
transactionId (facultatif) |
|
L'ID de transaction locale. Définissez ce paramètre uniquement lorsque vous lisez des données dans le cadre d'une transaction locale. Pour savoir comment obtenir et utiliser cet ID, consultez la rubrique Utiliser des transactions locales. |
Critères de requête par plage
Le paramètre rangeRowQueryCriteria est de type RangeRowQueryCriteria et comprend les éléments suivants.
|
Nom |
Type |
Description |
|
tableName (obligatoire) |
|
Le nom de la table. |
|
inclusiveStartPrimaryKey (obligatoire) |
|
La clé primaire de début inclusive. Pour une lecture vers l'avant, elle doit être inférieure à la clé primaire de fin. Pour une lecture vers l'arrière, elle doit être supérieure. Son schéma doit correspondre à celui de la table. Utilisez |
|
exclusiveEndPrimaryKey (obligatoire) |
|
La clé primaire de fin exclusive. Son schéma doit correspondre à celui de la table. Utilisez |
|
direction (facultatif) |
|
Le sens de lecture. La valeur par défaut est |
|
maxVersions (facultatif) |
|
Le nombre maximal de versions de données à renvoyer pour chaque colonne d'attribut. Si davantage de versions correspondent, Tablestore renvoie les versions de la plus récente à la plus ancienne. Définissez au moins l'un des paramètres |
|
timeRange (facultatif) |
|
La plage de versions de données. Seules les versions comprises dans cette plage sont renvoyées. Définissez au moins l'un des paramètres |
|
limit (facultatif) |
|
Le nombre maximal de lignes à renvoyer en un seul appel. La valeur doit être supérieure à 0. Lorsque la limite est atteinte, utilisez la valeur |
|
columnsToGet (facultatif) |
|
Les colonnes à renvoyer. Si vous ne spécifiez pas ce paramètre, la ligne entière est renvoyée. Si vous le spécifiez, les lignes ne contenant aucune des colonnes indiquées ne sont pas renvoyées. |
|
filter (facultatif) |
|
La condition de filtrage. Si vous spécifiez à la fois Pour savoir comment configurer le filtre, consultez la rubrique Utiliser des filtres. |
Réponse
L'objet GetRangeResponse contient les champs spécifiques à l'opération suivants.
|
Champ |
Type |
Description |
|
|
|
Les lignes renvoyées lors de l'appel actuel, obtenues en appelant la méthode |
|
|
|
La clé primaire de début pour l'appel suivant, obtenue en appelant la méthode |
Exemples de scénarios
Itération paginée
La valeur nextStartPrimaryKey présente dans la réponse correspond à la clé primaire de début de la page suivante. Appelez la méthode getRange dans une boucle jusqu'à ce que la valeur nextStartPrimaryKey soit nulle afin de balayer toutes les lignes correspondantes.
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);
Balayage inverse
Utilisez la méthode setDirection(Direction.BACKWARD) pour effectuer un balayage dans l'ordre inverse. Dans ce cas, la clé primaire de début doit être supérieure à la clé primaire de fin.
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());
Filtrage conditionnel
Utilisez la méthode setFilter pour ne renvoyer que les lignes correspondant à une condition basée sur la valeur d'une colonne.
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());