尝试使用Datastax驱动程序将int, time, hash
提供的值存储到Cassandra中。
哈希显示为{ "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`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驱动程序可以接受的格式?
使用:
编辑:
'问题'的JSON值哈希是{" Q17.1_4":" val"," Q17.2":"其他",...}
另外 - 我可以插入前两列就好了。省略insert语句中的第三个值,所以我知道这两个值不是罪魁祸首。
答案 0 :(得分:0)
发现了两个问题:
如果是哈希,则最后一个参数将被视为选项。因此,请确保在执行具有map数据类型所需的最后一个参数的语句时传递空选项。
type_converter.rb:331:在
varchar_to_bytes': undefined method
编码' for 1:Fixnum(NoMethodError)
这让我相信某处某处存在无效价值。为了解决这个问题,我创建了一个临时哈希并检查每个值,以确保它是一个字符串,然后再添加到此临时哈希。然后使用此临时值,我可以使用存储过程添加到DB。