Перебор таблицы накоплений с помощью scala

#scala #accumulo

#scala #accumulo

Вопрос:

У меня есть таблица в именованных записях accumulo с несколькими семействами и квалификаторами для row_id, она выглядит так в оболочке accumulo.

 michaelp@accumulo records> scan
2016-10-17 16:27:55,359 [Shell.audit] INFO : michaelp@accumulo 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
  

Я хочу иметь возможность сканировать эти пару строк с помощью соединителя scala. После необходимого импорта мой код выглядит следующим образом:

 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)
  

Я передаю пустой диапазон, чтобы получить каждую строку в таблице. Проблема заключается в том, когда я пытаюсь выполнить итерацию по результатам. Он застрял в первой строке.

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

Итак, почему итератор не движется вперед?

Ответ №1:

Потому что при вызове batchReader.iterator каждый раз создается новый итератор. вместо этого сделайте что-то вроде приведенного ниже

 val iterator = batchReader.iterator

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

Комментарии:

1. Это правильный ответ, будет отмечен через секунду. Спасибо