Commande comme SQL LIMIT dans HBase
HBase a-t-il une commande qui fonctionne comme SQL LIMIT
query?
Je peux le faire par setStart
et setEnd
, mais je ne veux pas itérer toutes les lignes.
4 réponses
À partir du shell HBase, vous pouvez utiliser LIMIT:
hbase> scan 'test-table', {'LIMIT' => 5}
À Partir de l'API Java, vous pouvez utiliser Scan.setMaxResultSize(N)
ou scan.setMaxResultsPerColumnFamily(N)
.
Il existe un filtre appelé PageFilter. Sa destinée à 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: la "limite" doit être entre guillemets simples.
scan 'table-name', {'LIMIT' => 10}
Un moyen garanti est de faire la limitation du côté client, à l'intérieur de la boucle d'itérateur. C'est l'approche adoptée dans le Shell HBase Ruby. À partir de la table.rb ($HBASE_HOME / hbase-shell / src / main/ruby/hbase / table.RB): Ligne 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(balayage). Le filtre de page s'assurera que chaque serveur de région retournera au plus des lignes de limite, la limite de mise en cache d'analyse assurez-vous que chaque serveur de région Lira à l'avance et mettra en cache au plus les lignes' limit', puis la vérification de la limite de boucle du client peut casser la boucle après avoir obtenu les premières lignes' limit ' dans l'ordre reçu par le client.