2014-10-18 102 views
1

我试图使用Datastax驱动程序将值作为int, time, hash提供到Cassandra中。Ruby:如何将哈希值插入到Cassandra映射中

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

我可以:作为{ "Q17.1_4"=>"val", "Q17.2"=>"other", ...}

中定义了表作为显示

哈希得到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 `bind': expecting exactly 3 bind parameters, 2 given (ArgumentError)

这(对我来说)没有一种方法可以将哈希转换成卡桑德拉想要的。

如果我插入VAL作为字符串(使用hash.to_s)我得到这个错误:

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

...这同样适用于将其转换为一个JSON字符串,改变双引号来单等。

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

所以,问题是 - 我怎么得到这个红宝石散列成卡桑德拉司机将接受的格式?

使用:

  • 红宝石2.1.3
  • 卡桑德拉2.0(带最新的Datastax司机)

编辑:

的JSON值 '问题' 散列{“Q17.1_4”:“val”,“Q17.2”:“其他”,...}

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

+0

什么是'json_val'?是否:'{“Q17.1_4”=>“val”,“Q17.2”=>“other”,...}'就像你发布的那样? – Surya 2014-10-18 12:58:45

回答

0

发现了两个问题:

  1. 有一个在该文档的注释:

Last argument will be treated as options if it is a Hash. Therefore, make sure to pass empty options when executing a statement with the last parameter required to be a map datatype.

  • 当我要么把一个空散列作为最后参数或交换我的散列值为不同的参数错误消息更改为:
  • type_converter.rb:331:in varchar_to_bytes': undefined method encode' for 1:Fixnum (NoMethodError)

    这使我相信在那里有一个无效的价值。为了解决这个问题,我创建了一个临时哈希,并检查每个值以确保它是一个字符串,然后将其添加到此临时哈希中。然后使用这个临时值,我可以使用存储过程添加到数据库。