HBase a-t-il une commande qui fonctionne comme SQL LIMIT
requête?
Je peux le faire par setStart
et setEnd
, mais je ne veux pas répéter toutes les lignes.
Depuis HBase Shell, vous pouvez utiliser LIMIT:
hbase> scan 'test-table', {'LIMIT' => 5}
À partir de l'API Java Java, vous pouvez utiliser Scan.setMaxResultSize(N)
ou scan.setMaxResultsPerColumnFamily(N)
.
Il existe un filtre appelé PageFilter. Il est destiné à cet effet.
Scan scan = new Scan(Bytes.toBytes("smith-"));
scan.addColumn(Bytes.toBytes("personal"), Bytes.toBytes("givenName"));
scan.addColumn(Bytes.toBytes("contactinfo"), Bytes.toBytes("email"));
scan.setFilter(new PageFilter(25));
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
// ...
}
http://Java.dzone.com/articles/handling-big-data-hbase-part-4
Si l'on utilise HBase Shell, la commande suivante peut être utilisée pour limiter les résultats de la requête: "LIMIT" doit être placé entre guillemets simples.
scan 'table-name', {'LIMIT' => 10}
Un moyen garanti est de faire la limitation côté client, à l'intérieur de la boucle de l'itérateur. C'est l'approche adoptée dans le HBase Ruby Shell. From table.rb ($ HBASE_HOME/hbase-Shell/src/main/Ruby/hbase/table.rb): Line 467:
# Start the scanner
scanner = @table.getScanner(_hash_to_scan(args))
iter = scanner.iterator
# Iterate results
while iter.hasNext
if limit > 0 && count >= limit
break
end
row = iter.next
...
end
Il peut être rendu un peu plus efficace en ajoutant scan.setFilter (nouveau PageFilter (limite)) et scan.setCaching (limite), puis table.getScanner (scan). Le filtre de page garantira que chaque serveur de région renverra au plus de lignes de limite, la limite de mise en cache de l'analyse garantira que chaque serveur de région lira à l'avance et mettra en cache au plus les lignes de `` limite '', puis la vérification de la limite de boucle client peut rompre la boucle après obtenir les premières lignes "limit" dans l'ordre reçu par le client.
Dans HBase 1.2, la Scan.setMaxResultSize(N)
ne peut pas agir comme un paramètre de limitation du nombre de lignes. Le maxResultSize limite la taille maximale des résultats en octets (mis en cache côté client). J'ai trouvé que la ResultScanner.next(int nbRows)
peut limiter le nombre de lignes pendant l'itération.