我使用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类相同。
答案 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