cassandra和从ruby客户机创建int列名

kulphzqa  于 2021-06-15  发布在  Cassandra
关注(0)|答案(2)|浏览(371)

我试图用一个32位有符号整数的比较器/验证器创建动态列。这显然将节省存储空间和其他优势。目前,如果我有一个utf8type验证器(使用twitter的cassandra客户机for 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列名,并且可以在基于cassandra1.2的应用程序中使用基于int的列名?

5lhxktic

5lhxktic1#

@Yoshiji先生
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]
i86rm4rw

i86rm4rw2#

twitter cassandra库让开发人员序列化/反序列化所有值。它要求你给它的所有东西都是二进制字符串表示。因此,如果你想使用int作为你的比较器,你需要在插入之前打包它们,在从cassandra中取出它们时解包它们。您的插入需要如下所示:

db.insert(:foo, 'mykey', {[5].pack('N*') => 'myval'})

相关问题