cassandra Ruby: несколько значений для параметра блока (2 для 1)

79
5

Я пытаюсь следовать учебнику по большим данным, он хочет читать данные из ключа, определенного с помощью cqlsh.

Я скомпилировал этот фрагмент кода:

require 'rubygems'
require 'cassandra'

db = Cassandra.new('big_data', '127.0.0.1:9160')

# get a specific user 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. Как это исправить?

спросил(а) 2021-01-19T20:29:13+03:00 9 месяцев, 1 неделя назад
1
Решение
65

Его немного сложно определить, какая строка - 33, но похоже, что проблема заключается в том, что get_range дает два значения, но ваш блок принимает только первый. Если вы только заботитесь о клавишах строк, а не о столбцах, вы должны использовать get_range_keys.

Похоже, что вы действительно заботитесь о значениях столбца, потому что вы их снова db.multi_get с помощью 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

ответил(а) 2021-01-19T20:29:13+03:00 9 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема