Cassandraのデータ操作(Perl/Net::Cassandra)

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