如何使用Ruby Thrift客户端创建Accumulo Range对象

时间:2014-03-06 19:00:01

标签: python ruby thrift accumulo

我使用Thrift Proxy运行Accumulo 1.5。我正在使用Ruby连接到thrift,但我想如果我使用Python,就会出现同样的情况。

我已经能够连接到Accumulo,创建更新,并按特定列扫描表格。我正在尝试按特定的行ID进行查询。

querykey = Key.new('row'=>rowid)
querykey_end = Key.new('row'=>"#{rowid}\0")
queryrange = Range.new('start' => querykey, 'startInclusive' => true, 'stop' => querykey_end, 'stopInclusive' => false)
queryscanoptions = ScanOptions.new({'range' => queryrange})

不幸的是,这会在我的Range构造函数上引发错误。

`initialize': wrong number of arguments (1 for 2..3) (ArgumentError)

Ruby客户端上没有太多(任何)文档,所以我一直在使用thrift代码。 Range类在proxy_types.rb中定义,但其定义方式与我正在使用的其他Thrift类相同。

1 个答案:

答案 0 :(得分:2)

这是命名空间问题。 Accumulo Thrift代码都存在于根命名空间中,但Ruby拥有它自己的Range类,它没有被覆盖。这个问题存在于Accumulo 1.5.0之前。为了解决这个问题,我转到github,从1.5.2分支中获取生成的Thrift代码,其中所有Thrift对象都放在Accumulo命名空间中。现在我可以打电话给Accumulo::Range.new,它就像一个魅力。该更新还为Python thrift代码添加了一个命名空间。

Accumulo 1.5.2 Ruby Thrift代码在这里:https://github.com/apache/accumulo/tree/1.5.2-SNAPSHOT/proxy/src/main/ruby

这是修复所有内容的提交:https://github.com/apache/accumulo/commit/27ee2367056e5ad0cb6175f91154cd13d49e2c95