Ruby:如何将Hash值插入到Cassandra map中

时间:2014-10-18 12:55:12

标签: ruby cassandra

尝试使用Datastax驱动程序将int, time, hash提供的值存储到Cassandra中。

哈希显示为{ "Q17.1_4"=>"val", "Q17.2"=>"other", ...}

将表定义为:

  • INT
  • 时间戳
  • 地图
  • PK(int,timestamp)

我可以将PK插入正常但是很难将哈希值强制转换为Cassandra可以处理的内容。

创建了一个准备好的语句,并在(尝试)循环遍历值时使用它:

stmt = session.prepare( "insert into forms( id, stamp, questions ) values ( ?,?,? )" )

...
json_val.each{ |key,val|
    result = session.execute( stmt, val[ 'ID' ].to_i, Time.parse( val[ 'tDate' ]).to_i, val )
}

如果我插入' val'作为哈希我得到这个错误:

  

/lib/cassandra/statements/prepared.rb:53:in`bound':期待正好3个绑定参数,2给定(ArgumentError)

这说(对我而言)没有一种方法可以将哈希转换为Cassandra想要的方法。

如果我将val作为字符串插入(使用hash.to_s),我会收到此错误:

  

/lib/cassandra/protocol/type_converter.rb:331:in varchar_to_bytes': undefined method编码' for 1:Fixnum(NoMethodError)

...同样可以将它转换为json字符串,将双引号更改为单引号等等。

我可以使用cqlsh(命令行)(EG insert into forms (id, stamp, questions) values ( 123, 12345678, { 'one':'two','three':'four'});

插入值

所以问题是 - 如何将这个Ruby哈希变成Cassandra驱动程序可以接受的格式?

使用:

  • Ruby 2.1.3
  • Cassandra 2.0(使用最新的Datastax驱动程序)

编辑:

'问题'的JSON值哈希是{" Q17.1_4":" val"," Q17.2":"其他",...}

另外 - 我可以插入前两列就好了。省略insert语句中的第三个值,所以我知道这两个值不是罪魁祸首。

1 个答案:

答案 0 :(得分:0)

发现了两个问题:

  1. 文档中有一条注释:
  2.   

    如果是哈希,则最后一个参数将被视为选项。因此,请确保在执行具有map数据类型所需的最后一个参数的语句时传递空选项。

    1. 当我将空哈希作为最后一个参数或者将我的哈希值交换为另一个参数时,错误消息更改为:
    2.   

      type_converter.rb:331:在varchar_to_bytes': undefined method编码' for 1:Fixnum(NoMethodError)

      这让我相信某处某处存在无效价值。为了解决这个问题,我创建了一个临时哈希并检查每个值,以确保它是一个字符串,然后再添加到此临时哈希。然后使用此临时值,我可以使用存储过程添加到DB。

相关问题