2014-10-18 67 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)

    這使我相信在那裏有一個無效的價值。爲了解決這個問題,我創建了一個臨時哈希,並檢查每個值以確保它是一個字符串,然後將其添加到此臨時哈希中。然後使用這個臨時值,我可以使用存儲過程添加到數據庫。