Accumulo createBatchScanner范围无法按预期工作

时间:2013-09-27 15:55:33

标签: c# thrift accumulo

我不能让一个批处理扫描程序只扫描一个特定的行,当设置启动和停止键到同一个东西我没有条目回来,当使用扫描仪我得到这个例外:

  

“java.lang.IllegalArgumentException:Start键必须小于范围内的结束键(Test:[] 0 false,Test:[] 0 false)”...

我在Visual Studio 2010中使用C#编写,并在项目中使用Thrift(版本0.9.1.1)和Accumulo(版本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());

2 个答案:

答案 0 :(得分:3)

问题可能是你的范围。在Java API中,您可以为单行构造一个Range,其中包含:

Range r = new Range("myRow");

在thrift Proxy API中,您只能为Range构造函数提供Keys,而不仅仅是RowIDs(这也是Java API中的一个选项,但它是Proxy API中的唯一选项)。键表示单个条目,因此扫描:

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

只会扫描一个确切的条目(如果你没有为表配置VersioningIterator,可能会对它的所有版本进行扫描)。

因此,如果要扫描行“a”中的所有条目,则不要像这样扫描:

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

相反,你这样扫描行==“a”:

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

或者,对于行开始,使用“a”:

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

答案 1 :(得分:0)

你有没有检查过这种可能性? https://issues.apache.org/jira/browse/ACCUMULO-1189 它在Accumulo 1.5中修复,你使用1.4,所以看起来值得一看。