2016-10-17 4 views
2

Ich habe eine Tabelle in accumulo namens Datensätze mit ein paar Familien und Qualifier pro row_id, sieht es so aus in accumulo Shell.Iterating über akkumulo Tabelle mit scala

[email protected] records> scan 
2016-10-17 16:27:55,359 [Shell.audit] INFO : [email protected] records> scan 
E001 department:sales [] 0 
E001 hire_date:20160101 [] 0 
E001 name:bob [] 0 
E001 name:jerry [] 0 
E002 department:marketing [] 0 
E002 hire_date:20160202 [] 0 
E002 name:sarah [] 0 
E003 department:engineering [] 0 
E003 hire_date:20160303 [] 0 
E003 name:joe [] 0 

Ich möchte diese paar Zeilen mit einem Scala-Konnektor scannen können. Nachdem die benötigten Importe sieht mein Code wie folgt aus:

var opts = new ClientOnRequiredTable() 
var bsOpts = new BatchScannerOpts() 
opts.parseArgs("test", Array("-t", "records","-u", "michaelp", "-p", "****", "-z", "zookeeper:2181", "-i", "accumulo"), bsOpts) 
var connector = opts.getConnector() 
var batchReader = connector.createBatchScanner("records", opts.auths, bsOpts.scanThreads) 
batchReader.setTimeout(bsOpts.scanTimeout, TimeUnit.MILLISECONDS) 
var x = new Range() 
var y = new LinkedList[Range] 
y.add(x) 
batchReader.setRanges(y) 

ich in einem leeren Bereich passieren jede Zeile in der Tabelle zu erhalten. Das Problem ist, wenn ich versuche, die Ergebnisse zu durchlaufen. Es haftet in der ersten Reihe.

scala> while (batchReader.iterator.hasNext()) {println(batchReader.iterator.next.getKey().toString())} 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
E001 department:sales [] 1476720996135 false 
... 

Warum also bewegt sich der Iterator nicht?

Antwort

4

Denn wenn Sie batchReader.iterator aufrufen, wird jedes Mal ein neuer Iterator erstellt. stattdessen tun etwas wie unten

val iterator = batchReader.iterator 

while(iterator.hasNext) { 
println(iterator.next.getKey().toString()) 
} 
+0

Dies ist die richtige Antwort, wird in einer Sekunde Häkchen. Vielen Dank – Mike