web-dev-qa-db-fra.com

Commande comme SQL LIMIT dans HBase

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.

47
Mohammad

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).

85
th30z

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

13
mirsik

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}
6
Animesh Raj Jha

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.

1
devarajaswami

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.

0
delphi.xk