【问题标题】:Cassandra and creating an int column name from Ruby clientCassandra 并从 Ruby 客户端创建一个 int 列名
【发布时间】:2018-12-26 11:40:47
【问题描述】:

我正在尝试使用 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 的列名?

【问题讨论】:

    标签: ruby-on-rails ruby cassandra thrift irb


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      @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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-06
        • 2017-04-24
        • 2012-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-06
        相关资源
        最近更新 更多