簡體   English   中英

了解cassandra數據庫的Ruby腳本

[英]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方法,每個條目被分解並投入kv ,在密鑰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.

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