2013-09-27 8 views
3

스캐너를 사용할 때 설정이 시작되고 중지 될 때 특정 행을 검색하는 배치 스캐너를 얻을 수 없습니다.이 예외가 발생합니다 :Accumulo createBatchScanner 범위가 예상대로 작동하지 않습니다.

...

내가 쓰고 있어요 "java.lang.IllegalArgumentException가 : 키를 시작 범위에서 (: [] 거짓, 테스트 [] 거짓이 시험) 최종 키보다 작은이어야합니다" Visual Studio 2010의 C#에서 Thrift (ver 0.9.1.1) 및 Accumulo (ver 1.5.0) proxy.thrift 코드를 프로젝트에서 사용합니다. 여기

내 코드, 모든 "작동"하지만,이 코드를 보여주는 Accumulo 1.5 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); 
     } 
    } 
} 

사용자 설명서에서 모든 항목을하지 않으며 그것이 내가 '과 동일 m하고 (그러나 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에서, 당신이, 한 행의 범위를 구성 할 수 있습니다 : 중고품 프록시 API에서

Range r = new Range("myRow"); 

, 당신은 단지 범위 생성자에 키, 단지의 ROWID를 제공 할 수 있습니다 (이것은에서 옵션입니다 Java API도 있지만 Proxy API에서 유일한 옵션입니다). (당신이 테이블에 대해 구성된 VersioningIterator이없는 경우, 그것의 가능성이 모든 버전)

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

은 오직 하나 개 정확한 항목에 걸쳐 검사를 발생합니다 : 키는 단일 항목, 그래서 스캔을 나타냅니다. 당신이 행 "A"에있는 모든 항목을 검사 할 경우

그래서,이 같은 검사하지 않습니다

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

을 오히려, 당신은 == "A"행에 대해 다음과 같이 스캔 :

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

또는이에 대한 행 startsWith "A":

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

고마워, 이제 작동 해 : D 방금 Range \ Stop의 끝에 \ 0을 추가했습니다. – loliman

0

이미 여기에 가능성을 확인 했습니까? https://issues.apache.org/jira/browse/ACCUMULO-1189 Accumulo 1.5에서는 고정되어 있으므로 1.4를 사용하므로 한 번 보셔도 좋습니다.

+0

내가 아니라 같은이 시작 가지고 범위, createScanner 및 createBatchScanner를 사용할 수 Accumulo 1.5 사용 중지 키. – loliman