Cassandraは、Thriftフレームワークを使用しているため、さまざまな言語でクライアントをコーディングすることができます。
ということで、PerlでCassandraのデータ操作を行ってみました。
Perl以外のクライアント用モジュールについては、以下を参照してください。
(モジュールインストール)
CPANから"Net::Cassandra"をインストールします。
私の環境では、"Class::Accessor"と"Bit::Vector"がインストールされなかったので、別途インストールしました。
cpan> install Net::Cassandra cpan> install Class::Accessor cpan> install Bit::Vector
以下、サンプルコードです。(といっても、Net::CassandraのSYNOPSISのままです)
(データ登録)
#!/usr/bin/env perl use strict; use warnings; use Net::Cassandra; my $cassandra = Net::Cassandra->new( hostname => 'localhost' ); my $client = $cassandra->client; my $key = 'hogehoge'; my $timestamp = time; eval { $client->insert( 'Keyspace1', $key, Net::Cassandra::Backend::ColumnPath->new( { column_family => 'Standard1', column => 'blog' } ), 'http://blog.example.com/hogehoge', $timestamp, Net::Cassandra::Backend::ConsistencyLevel::ZERO ); }; die $@->why if $@; __END__
データが登録されたか確認します。
cassandra> get Keyspace1.Standard1.['hogehoge'] line 1:23 extraneous input '.' expecting '[' => (column=626c6f67, value=http://blog.example.com/hogehoge, timestamp=1273812879) Returned 1 results.
(データ参照)
#!/usr/bin/env perl use strict; use warnings; use Data::Dumper; use Net::Cassandra; my $cassandra = Net::Cassandra->new( hostname => 'localhost' ); my $client = $cassandra->client; my $key = 'hogehoge'; eval { my $what = $client->get( 'Keyspace1', $key, Net::Cassandra::Backend::ColumnPath->new( { column_family => 'Standard1', column => 'blog' } ), Net::Cassandra::Backend::ConsistencyLevel::QUORUM ); print Dumper($what); }; die $@->why if $@; __END__
実行してみると、値が取得できているのが確認できます。
$ ./get_cassandra.pl $VAR1 = bless( { 'super_column' => undef, 'column' => bless( { 'timestamp' => '1273812879', 'value' => 'http://blog.example.com/hogehoge', 'name' => 'blog' }, 'Net::Cassandra::Backend::Column' ) }, 'Net::Cassandra::Backend::ColumnOrSuperColumn' );
(データ削除)
#!/usr/bin/env perl use strict; use warnings; use Net::Cassandra; my $cassandra = Net::Cassandra->new( hostname => 'localhost' ); my $client = $cassandra->client; my $key = 'hogehoge'; my $timestamp; eval { my $what = $client->get( 'Keyspace1', $key, Net::Cassandra::Backend::ColumnPath->new( { column_family => 'Standard1', column => 'blog' } ), Net::Cassandra::Backend::ConsistencyLevel::QUORUM ); $timestamp = $what->column->timestamp; }; die $@->why if $@; eval { $client->remove( 'Keyspace1', $key, Net::Cassandra::Backend::ColumnPath->new( { column_family => 'Standard1', column => 'blog' } ), $timestamp ); }; die $@->why if $@; __END__
タイムスタンプを指定しないと削除できなかったので、タイムスタンプを取得してから削除処理をしています。
データが削除されたか確認してみます。
cassandra> get Keyspace1.Standard1.['hogehoge'] line 1:23 extraneous input '.' expecting '[' Returned 0 results.
Apache Cassandra
Net::Cassandra - Interface to Cassandra - metacpan.org