0

我使用 Thrift 代理运行 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 客户端上没有太多(任何)文档,所以我一直在主要使用节俭代码。Range 类在 中定义proxy_types.rb,但它的定义方式与我使用的其他 Thrift 类相同。

4

1 回答 1

2

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

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

于 2014-03-06T19:00:01.323 回答