0

我正在尝试使用 32 位有符号整数的比较器/验证器创建动态列。这显然将节省存储空间以及其他优势。目前,如果我有一个 UTF8Type 验证器(使用 Twitter 的 cassandra Ruby 客户端),这将非常有用:

db.insert(:foo, 'mykey', {'mycol' => 'myval'})

这是出现问题的地方:

db.insert(:foo, 'mykey', {5 => 'myval'})

我认为这更像是一个 Ruby 问题而不是 Cassandra 问题。使用 Rails 控制台,我得到以下信息:

TypeError: no implicit conversion of Fixnum into String

进一步澄清,我不能简单地做:

db.insert(:foo, 'mykey', {'5' => 'myval'})

这将触发验证失败,该验证失败需要列的整数而不是字符串。

有没有办法让它在 Ruby 中合理地工作,这样我就不必使用 UTF8Type 列名,并且可以为我的基于 Cassandra 1.2 的应用程序坚持基于 int 的列名?

4

2 回答 2

1

@MrYoshiji

Fixnum可以在 Ruby 哈希中声明为键

只需使用正确的语法。您使用的是 Ruby,而不是 Python !!!

irb(main):010:0> { 1 => 'bonjour', 2 => "okay" }
=> {1=>"bonjour", 2=>"okay"}
irb(main):012:0> { 1 => 'bonjour', 2 => "okay" }.keys.map(&:class)
=> [Fixnum, Fixnum]
于 2013-05-29T18:44:28.727 回答
1

twitter Cassandra 库留给开发人员序列化/反序列化所有值。它要求您提供的所有内容都以二进制字符串表示。因此,如果您想使用整数作为比较器,您需要在插入之前打包它们,并在从 Cassandra 中取出它们时解包它们。您的插入需要如下所示:

db.insert(:foo, 'mykey', {[5].pack('N*') => 'myval'})
于 2013-06-02T16:52:24.260 回答