[英]Understanding Ruby script for cassandra database
我是Ruby新手。 但是由於某些問題,由於我們的ruby開發人員不可用,因此我必須處理代碼。 我們正在使用cassandra數據庫從Ruby(Sinatra)Web服務獲取值,並將其放入Cassandra密鑰空間中。 但是由於某些問題,數據無法插入。
在以下代碼中,partner_daily,partner_monthly等是stats鍵空間(數據庫)中的列族(表)。
if params and !partner_id.nil? and !activity_type.nil?
{
:partners_daily => "#{partner_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}_#{time.day}",
:partners_monthly => "#{partner_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}",
:partners_alltime => "#{partner_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}",
:channels_daily => "#{channel_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}_#{time.day}",
:channels_monthly => "#{channel_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}",
:channels_alltime => "#{channel_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}",
:countries_daily => "#{country}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}_#{time.day}",
:countries_monthly => "#{country}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}",
:countries_alltime => "#{country}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}"
}.each do |k,v|
stats.add(k, v, 1, 'count')
end
return "Activity stored in stats"
end
else
return "Error: client headers missing"
end
end
def count(table, key)
require 'cassandra-cql' # requiring this at the top was leading to error: unconfigured columnfamily
cqldb = CassandraCQL::Database.new('127.0.0.1:9160', {:keyspace => 'plystats'})
query = "update partners_daily set count = ? where key = ?"#"update #{table} set count = count+1 where key = ?;"
#return cqldb.execute(query, 0, 'sonia').inspect
return query
end
我想知道其中的數據插入邏輯是如何執行的,在哪里? 它在stats.add(k, v, 1, 'count')
嗎?
並且插入部分中有任何錯誤,因為它失敗了。
我想知道其中的數據插入邏輯是如何執行的,在哪里? 它在stats.add(k,v,1,'count')中嗎?
是的,那是應該發生的地方。 在{}
是字典/哈希值:
{
:partners_daily => # …
}.each do |k,v|
一個循環開始與each
方法,每個條目被分解並投入k
和v
,在密鑰k
並在值v
。 例如,哈希中的第一條記錄是:
:partners_daily => "#{partner_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}_#{time.day}",
然后,這將在each
循環中分解為:
k = :partners_daily
v = # The result of
"#{partner_id}_#{activity_type}_#{success == 1 ? 'sucess' : "failure:#{failure_code}"}_#{time.year}_#{time.month}_#{time.day}",
現在,我不知道partner_id
等的值是什么,但是要"123_sales_sucess_2013_6_01"
它看起來像"123_sales_sucess_2013_6_01"
注意那里有success
一詞的錯字。
由於有多個雙引號和花括號,因此有點混亂,因此我將其更改為:
[partner_id, activity_type, (success == 1 ? 'success' : "failure:#{failure_code}"), time.year, time.month, time.day].join("_")
但是請注意,那里有很多重復,所以我將整個哈希更改為(至少):
success_string = success == 1 ?
'success' :
"failure:#{failure_code}"
data = {
:partners_daily => [partner_id, activity_type,success_string,time.year,time.month,time.day].join("_"),
:partners_monthly => [partner_id,activity_type,success_string,time.year,time.month].join("_"),
:partners_alltime => [partner_id,activity_type,success_string].join("_"),
:channels_daily => [channel_id,activity_type,success_string,time.year,time.month,time.day].join("_"),
:channels_monthly => [channel_id,activity_type,success_string,time.year,time.month].join("_"),
:channels_alltime => [channel_id,activity_type,success_string].join("_"),
:countries_daily => [country,activity_type,success_string,time.year,time.month,time.day].join("_"),
:countries_monthly => [country,activity_type,success_string,time.year,time.month].join("_"),
:countries_alltime => [country,activity_type,success_string].join("_")
}
data.each do |k,v|
# more code…
它開始變得更易於閱讀和查看邏輯。 另外,通過將哈希放入data
變量中而不是立即對其進行處理,可以使您更輕松地檢查它,例如
warn "data = #{data.inspect}"
會將數據的表示形式輸出到控制台,因此至少您可以了解腳本嘗試放入的內容。在此代碼的頂部,還可以添加warn "script = #{script.inspect}"
檢查什么script
對象的模樣。
如果script
對象是Cassandra實例,即有script = Cassandra.new "blah", "blahblah"
這樣的東西script = Cassandra.new "blah", "blahblah"
進行設置,那么add
方法就是這個
給定的簽名是add(column_family, key, value, *columns_and_options)
但似乎與您的調用不匹配:
stats.add(k, v, 1, 'count')
應該(可能)是:
stats.add('count', k, v, 1)
實際上,我什至不確定data
哈希中的串聯是否會發生,也許所有這些都應該傳遞給add
,但這是您的數據,因此我不確定。
請在下面發表評論,我將對其進行更新。
在IRB中嘗試檢查其語法錯誤:
success = 1
# => 1
partner_id = 123
# => 123
activity_type = "something"
# => "something"
time = Time.now
# => 2013-06-05 11:17:50 0100
channel_id = 456
# => 456
country = "UK"
# => "UK"
success_string = success == 1 ?
'success' :
"failure:#{failure_code}"
# => "success"
data = {
:partners_daily => [partner_id, activity_type,success_string,time.year,time.month,time.day].join("_"),
:partners_monthly => [partner_id,activity_type,success_string,time.year,time.month].join("_"),
:partners_alltime => [partner_id,activity_type,success_string].join("_"),
:channels_daily => [channel_id,activity_type,success_string,time.year,time.month,time.day].join("_"),
:channels_monthly => [channel_id,activity_type,success_string,time.year,time.month].join("_"),
:channels_alltime => [channel_id,activity_type,success_string].join("_"),
:countries_daily => [country,activity_type,success_string,time.year,time.month,time.day].join("_"),
:countries_monthly => [country,activity_type,success_string,time.year,time.month].join("_"),
:countries_alltime => [country,activity_type,success_string].join("_")
}
# => {:partners_daily=>"123_something_success_2013_6_5", :partners_monthly=>"123_something_success_2013_6", :partners_alltime=>"123_something_success", :channels_daily=>"456_something_success_2013_6_5", :channels_monthly=>"456_something_success_2013_6", :channels_alltime=>"456_something_success", :countries_daily=>"UK_something_success_2013_6_5", :countries_monthly=>"UK_something_success_2013_6", :countries_alltime=>"UK_something_success"}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.