簡體   English   中英

Ruby:如何將哈希值插入Cassandra地圖

[英]Ruby: how to insert Hash value into Cassandra map

我試圖使用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:在`bind'中:恰好期望3個綁定參數,給定2個(ArgumentError)

(對我來說)這表明沒有一種將哈希轉換為Cassandra想要的方法。

如果我將val作為字符串插入(使用hash.to_s ), hash.to_s此錯誤:

/lib/cassandra/protocol/type_converter.rb:331:in varchar_to_bytes': undefined method encoding'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驅動程序)

編輯:

“ questions”哈希的JSON值為{“ Q17.1_4”:“ val”,“ Q17.2”:“ other”,...}

另外-我可以插入前兩列。 從insert語句中省略第三個值是可行的,因此我知道這兩個值不是這里的罪魁禍首。

發現了兩個問題:

  1. 在文檔中有一條注釋:

如果最后一個參數是哈希,則將其視為選項。 因此,確保在執行帶有最后一個參數的語句時必須傳遞空選項,而最后一個參數必須是map數據類型。

  1. 當我將空哈希作為最后一個參數或將哈希值交換為其他參數時,錯誤消息更改為:

type_converter.rb:331:在varchar_to_bytes': undefined method編碼為1:Fixnum(NoMethodError)

這使我相信某個地方存在無效值。 為了解決這個問題,我創建了一個臨時哈希,並在將其添加到該臨時哈希之前檢查了每個值以確保它是字符串。 然后使用這個臨時值,我可以使用存儲過程將其添加到數據庫中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM