cassandra Ruby:块参数的多个值(2 比 1)

Posted

技术标签:

【中文标题】cassandra Ruby:块参数的多个值(2 比 1)【英文标题】:cassandra Ruby : multiple values for a block parameter (2 for 1) 【发布时间】:2014-05-06 17:06:05 【问题描述】:

我正在尝试学习有关大数据的教程,它想从使用 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 版本。如何解决?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于cassandra Ruby:块参数的多个值(2 比 1)的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra选择查询多个参数

在 EC2 Ruby on Rails 上连接到 datastax 集群上的 cassandra 节点

Cassandra 的哈希值是不是跨多个表具有相同的值?

201706 Ruby 基础 & 元编程

如何在子类中添加命名参数或在 Ruby 2.2 中更改它们的默认值?

Ruby:如何获取可选 proc 参数的默认值