2012-03-05 5 views
2

Я получаю доступ к кассандре из рубинового драгоценного камня. Я хочу извлечь данные из db cassandra, указав, в каких столбцах я хочу. всякий раз, когда я запускаю этотCassandra Ruby gem get column

conn.get (: column_family, 'key1', [63,62])

Я получаю следующее сообщение об ошибке,

TypeError: can't convert Array into String 
    from /home/ubuntu/.rvm/gems/[email protected]/gems/thrift-0.8.0/lib/thrift/transport/framed_transport.rb:84:in `write' 
    from /home/ubuntu/.rvm/gems/[email protected]/gems/thrift-0.8.0/lib/thrift/protocol/binary_protocol.rb:112:in `write_string' 
    from /home/ubuntu/.rvm/gems/[email protected]/gems/thrift-0.8.0/lib/thrift/client.rb:35:in `write' 
    from /home/ubuntu/.rvm/gems/[email protected]/gems/thrift-0.8.0/lib/thrift/client.rb:35:in `send_message' 
    from /home/ubuntu/.rvm/gems/[email protected]/bundler/gems/cassandra-7474449189f3/vendor/0.8/gen-rb/cassandra.rb:107:in `send_multiget_slice' 
    from /home/ubuntu/.rvm/gems/[email protected]/bundler/gems/cassandra-7474449189f3/vendor/0.8/gen-rb/cassandra.rb:102:in `multiget_slice' 
    from /home/ubuntu/.rvm/gems/[email protected]/bundler/gems/thrift_client-00893a3accc5/lib/thrift_client/abstract_thrift_client.rb:150:in `handled_proxy' 
    from /home/ubuntu/.rvm/gems/[email protected]/bundler/gems/thrift_client-00893a3accc5/lib/thrift_client/abstract_thrift_client.rb:60:in `multiget_slice' 
    from /home/ubuntu/.rvm/gems/[email protected]/bundler/gems/cassandra-7474449189f3/lib/cassandra/protocol.rb:64:in `_multiget' 
    from /home/ubuntu/.rvm/gems/[email protected]/bundler/gems/cassandra-7474449189f3/lib/cassandra/cassandra.rb:619:in `multi_get' 
    from /home/ubuntu/.rvm/gems/[email protected]/bundler/gems/cassandra-7474449189f3/lib/cassandra/cassandra.rb:592:in `get' 
    from (irb):5:in `block in irb_binding' 
    from /home/ubuntu/.rvm/gems/[email protected]/gems/connection_pool-0.1.0/lib/connection_pool.rb:41:in `with' 
    from (irb):4 
    from /home/ubuntu/.rvm/rubies/ruby-1.9.2-p180/bin/irb:16:in `<main>' 

пакет питона ' pycassa 'предоставляет возможность указать, какие столбцы должны быть получены. Как это сделать в рубине?

ответ

2

В настоящее время .get() и .multi_get() не принимают список имен столбцов. Существует open issue for this on GitHub. Вместо этого вы можете использовать .get_columns().

conn.get_columns(:column_family, 'key1', [63,62]) 

Это возвращает массив значений в том же порядке, который указан для ваших имен столбцов. В качестве альтернативы вы можете использовать драгоценный камень cassandra-cql:

handle.execute("select 63,62 from column_family where KEY = 'key1'").fetch 
0

Основываясь на моем чтении драгоценного камня, это ваш [63,62], который отбрасывает драгоценный камень. Синтаксис для третьего аргумента ожидает строку для под-столбца.

Из испытаний в source code:

@twitter.get(:Users, key, 'user') #@twitter == your conn 

Существует также @twitter.multi_get(:Users, [key + '1', key + '2', 'bogus']), что позволяет получить много элементов сразу.