3

バッチ スキャナーで特定の行のみをスキャンすることはできません。設定が開始キーと停止キーを同じものにすると、エントリが返されません。スキャナーを使用すると、次の例外が発生します。

「java.lang.IllegalArgumentException: 開始キーは範囲内の終了キーより小さくなければなりません (テスト: [] 0 false、テスト: [] 0 false)」...

Visual Studio 2010 で C# を作成し、プロジェクトで 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());
4

2 に答える 2

3

問題はおそらくあなたの範囲です。Java API では、以下を使用して単一行の Range を構築できます。

Range r = new Range("myRow");

thrift Proxy API では、RowID だけでなく、キーのみを Range コンストラクターに渡すことができます (これは Java API のオプションでもありますが、Proxy API の唯一のオプションです)。キーは単一のエントリを表すため、以下をスキャンします。

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

その 1 つの正確なエントリ (テーブルに 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)
于 2013-09-29T05:25:19.213 に答える