我正在尝试关注大数据的教程,它希望从使用cqlsh定义的键空间中读取数据。
我已经成功编译了这段代码:
require 'rubygems'
require 'cassandra'
db = Cassandra.new('big_data', '127.0.0.1:9160')
# get a specific user's tags
row = db.get(:user_tags,"paul")
###
def tag_counts_from_row(row)
tags = {}
row.each_pair do |pair|
column, tag_count = pair
#tag_name = column.parts.first
tag_name = column
tags[tag_name] = tag_count
end
tags
end
###
# insert a new user
db.add(:user_tags, "todd", 3, "postgres")
db.add(:user_tags, "lili", 4, "win")
tags = tag_counts_from_row(row)
puts "paul - #{tags.inspect}"
但是当我写这个部分来输出每个人的标签时,我收到一个错误。
user_ids = []
db.get_range(:user_tags, :batch_size => 10000) do |id|
# user_ids << id
end
rows_with_ids = db.multi_get(:user_tags, user_ids)
rows_with_ids.each do |row_with_id|
name, row = row_with_id
tags = tag_counts_from_row(row)
puts "#{name} - #{tags.inspect}"
end
错误是:
第33行:警告:阻止参数的多个值(2表示1)
我认为错误可能来自Cassandra和Ruby的不兼容版本。如何解决?
答案 0 :(得分:1)
有点难以分辨哪一行是33,但看起来问题是get_range
产生两个值,但你的块只占第一个。如果您只关心行键而不关心列,那么您应该使用get_range_keys
。
看起来您确实关心列值,因为您使用db.multi_get
再次取出它们。这是一个不必要的额外查询。您可以将代码更新为:
db.get_range(:user_tags, :batch_size => 10000) do |id, columns|
tags = tag_counts_from_row(columns)
puts "#{id} - #{tags.inspect}"
end