2013-09-27 4 views
3

Я не могу получить пакетный сканер для сканирования только определенной строки, когда настройки запускаются и останавливают ключи к тому же, что я не получаю обратно, при использовании сканера я получаю это исключение:Accumulo createBatchScanner диапазон работает не так, как ожидалось

"java.lang.IllegalArgumentException: ключ Start должен быть меньше, чем конец ключа в диапазоне (Тест: [] 0 ложно, Тест: [] 0 ложно)" ...

Я пишу в C# в Visual Studio 2010 и с использованием Thrift (ver 0.9.1.1) и Accumulo (ver 1.5.0) proxy.thrift в проекте.

Вот мой код, все «работает», но я не получаю никаких записей из client.nextK

class Program 
{ 
    static byte[] GetBytes(string str) 
    { 
     return Encoding.ASCII.GetBytes(str); 
    } 

    static string GetString(byte[] bytes) 
    { 
     return Encoding.ASCII.GetString(bytes); 
    } 

    static void Main(string[] args) 
    { 
     try 
     { 
      /** connect **/ 
      TTransport transport = new TSocket("192.168.58.62", 42424); 
      transport = new TFramedTransport(transport); 
      TCompactProtocol protocol = new TCompactProtocol(transport); 
      transport.Open(); 

      AccumuloProxy.Client client = new AccumuloProxy.Client(protocol); 

      Dictionary<string, string> passwd = new Dictionary<string,string>(); 
      passwd.Add("password", "password"); 

      var login = client.login("root", passwd); 
      /** connect end **/ 

      /** Get all data from one "Row" **/ 
      var bScanner = new BatchScanOptions(); 

      Range range = new Range(); 

      range.Start = new Key(); 
      range.Start.Row = GetBytes("Test"); 

      range.Stop = new Key(); 
      range.Stop.Row = GetBytes("Test"); 

      bScanner.Ranges = new List<Range>(); 
      bScanner.Ranges.Add(range); 

      var scanId = client.createBatchScanner(login, "firstTable", bScanner); 

      var more = true; 
      while (more) 
      { 
       var scan = client.nextK(scanId, 10); 
       more = scan.More; 
       foreach (var entry in scan.Results) 
       { 
        Console.WriteLine("{0} {1}:{2} [{3}] {4}", GetString(entry.Key.Row), GetString(entry.Key.ColFamily), GetString(entry.Key.ColQualifier), GetString(entry.Key.ColVisibility), GetString(entry.Value)); 
       } 
      } 

      client.closeScanner(scanId); 
      Console.WriteLine(); 
      /** Get data end **/ 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
     } 
    } 
} 

руководство пользователя для Accumulo 1.5, показывает этот фрагмент кода, и это так же, как я м делает (но в C#): (http://accumulo.apache.org/1.5/accumulo_user_manual.html#_basic_table)

Range r = new Range(userid, userid); // single row 
Scanner s = conn.createScanner("userdata", auths); 
s.setRange(r); 
s.fetchColumnFamily(new Text("age")); 

for(Entry<Key,Value> entry : s) 
    System.out.println(entry.getValue().toString()); 

ответ

3

Проблема, скорее всего, ваш диапазон. В API Java, вы можете создать диапазон для одной строки, с:

Range r = new Range("myRow"); 

В комиссионном Proxy API, вы можете только дать ключи к конструктору Range, а не только ROWIDs (это вариант в Java API, но это единственный вариант в Proxy API). Ключи представляют собой одну запись, поэтому сканирование:

R1:CF1:CQ1:CV1 -> R1:CF1:CQ1:CV1 

только когда-либо привести сканирование через что один точный въездных (и, возможно, все версии этого, если вы не имеете VersioningIterator сконфигурированный для таблицы).

Итак, если вы хотите, чтобы просмотреть все записи в строке «а», вы не сканировать так:

"a":null:null:null(inclusive) -> "a":null:null:null(inclusive) 

Скорее всего, вы отсканировать, как это для строки == «а»:

"a":null:null:null(inclusive) -> "a\0":null:null:null(exclusive) 

Или это, для строки StartsWith «а»:

"a":null:null:null(inclusive) -> "b":null:null:null(exclusive) 
+1

Спасибо, теперь я получил его на работу: D Я просто добавил \ 0 до конца Range.Stop. – loliman

0

вы уже проверили эту возможность здесь? https://issues.apache.org/jira/browse/ACCUMULO-1189 Это исправлено в Accumulo 1.5, вы используете 1.4, так что стоит посмотреть.

+0

Я использую Accumulo 1.5, я могу использовать createScanner и createBatchScanner, но не с диапазоном, которые имеют те же начать nd stop key. – loliman