読者です 読者をやめる 読者になる 読者になる

プログラマでありたい

おっさんになっても、プログラマでありつづけたい

cassandraのkeyの一覧を取得したい

分散DB プログラム

 cassandraインストール時についてくるCUIベースのツールcassandra-cliでは、データ操作はget,set,delしか出来ません。getはkeyを元に取得するので、そもそもkeyが解っていないと全くデータはとれません。となると、keyの一覧が欲しくなる時があると思います。今のところ(0.61)は、thrift APIを使って取るしかないようです。
 以前、rubyでcassandraを操作するgemをインストールしたのですが、ドキュメント等はあまり揃っていません。ソースを見てみたところ、get_rangeというのがあったのでこれが使えそうです。

# cd /usr/local/lib/ruby/gems/1.8/gems/cassandra-0.8.2/lib/cassandra
# grep def cassandra.rb
For the initial client instantiation, you may also pass in :thrift_client with a ThriftClient subclass attached. On connection, that class will be used instead of the default ThriftClient class, allowing you to add additional behavior to the connection (e.g. query logging).
def initialize(keyspace, servers = "127.0.0.1:9160", thrift_client_options = {})
def disable_node_auto_discovery!
def disconnect!
def keyspaces
def inspect
def insert(column_family, key, hash, options = {})
def remove(column_family, key, *columns_and_options)
def clear_column_family!(column_family, options = {})
def clear_keyspace!(options = {})
def count_columns(column_family, key, *columns_and_options)
def multi_count_columns(column_family, keys, *options)
def get_columns(column_family, key, *columns_and_options)
def multi_get_columns(column_family, keys, *options)
def get(column_family, key, *columns_and_options)
def multi_get(column_family, keys, *columns_and_options)
def exists?(column_family, key, *columns_and_options)
def get_range(column_family, options = {})
def count_range(column_family, options = {})
def batch(options = {})
def calling_method
def compact_mutations!
def schema(load=true)
def client
def reconnect!
def check_keyspace
def new_client
def all_nodes

  # Return a list of keys in the column_family you request. Requires the
  # table to be partitioned with OrderPreservingHash. Supports the
  # <tt>:count</tt>, <tt>:start</tt>, <tt>:finish</tt>, and <tt>:consistency</tt>
  # options.
  def get_range(column_family, options = {})
    column_family, _, _, options =
      extract_and_validate_params(column_family, "", [options], READ_DEFAULTS)
    _get_range(column_family, options[:start].to_s, options[:finish].to_s, options[:count], options[:consistency])
  end

 get_rangeで、カラムファミリーを指定すれば全部取得出来そうです。オプションとして、開始や終了の行数?や取得件数を指定出来るようです。consistencyは、RDBMSで言うところの分離レベルに該当するみたいです。readの場合、ZERO,ANY,ONE,QUORUM,ALLがあるようです。ZEROとANYを指定しても意味はないようです。ALLも現時点では、未実装のようです。ONEが最初にレスポンスを返せるデータから。QUORUMがタイムスタンプの順に返すようです。
詳しくはAPI - Cassandra Wikiに書いてあるので、興味がある方は読んでおいてください。
 このget_rangeを使ってサンプルソースを書いてみました。

require 'rubygems'
require 'cassandra'
include Cassandra::Constants

keyspace = Cassandra.new('Keyspace1')

#取得
#p keyspace.get_range(:Standard2)
keyspace.get_range(:Standard2).each { |obj|
  p "Key = #{obj.key}"
  #obj.columns.each { |col|
  #  p col
  #}
}

 カラムの中身も見たい場合は、コメントを外して下さい。
実行すると以下のようになります。

# ruby cassandra_multiget.rb
"Key = 13420602303"
"Key = 13425560502"
"Key = 13425560300"
"Key = 13420602702"
"Key = 13425520003"

取得出来ました。