gpt4 book ai didi

c# - Accumulo createBatchScanner 范围未按预期工作

转载 作者:行者123 更新时间:2023-11-30 16:15:54 32 4
gpt4 key购买 nike

我无法让批处理扫描仪只扫描特定行,当设置启动和停止键到相同的东西时我没有返回任何条目,当使用扫描仪时我得到这个异常:

"java.lang.IllegalArgumentException: Start key must be less than end key in range (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());

最佳答案

问题很可能是你的范围。在 Java API 中,您可以为单行构造一个范围,使用:

Range r = new Range("myRow");

在 thrift Proxy API 中,您只能将 Key 赋予 Range 构造函数,而不仅仅是 RowID(这也是 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)

或者这个,对于 row startsWith "a":

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

关于c# - Accumulo createBatchScanner 范围未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19055132/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com