Cassandraのはじめ方─手を動かしてNoSQLを体感しよう

第8回 Cassandraで検索するには[後編]

この記事を読むのに必要な時間:およそ 5.5 分

前回からずいぶん時間がたってしまいました。申し訳ありません。

前回はgetメソッド,そしてget_sliceメソッドでデータを検索する方法を見ていきました。今回は残りのget_range_slices,multiget_slice,get_countの3つのメソッドを見ていきます。

前回同様,検索メソッドの確認の前準備としてデータを投入しておく必要があります。詳細は第7回をご覧ください。

複数のロウを取得する ~get_range_slicesメソッド

前回は基本的に1つのロウに対する操作でしたが,今回は複数のロウを取得してみましょう。そのために使うのがget_range_slicesメソッドです。

まずはコードを見てください。リスト1は郵便番号,住所とその読みを検索するコードです。

リスト1 郵便番号,住所と読みを検索

public class SimpleAddressSearchGetRangeSlices {

    public static final String KEYSPACE = "Keyspace1";

    public static final String COLUMN_FAMILY = "SimpleAddress";

    public static void main(String[] args) throws IOException {
        TSocket transport = new TSocket("localhost", 9160);
        TProtocol protocol = new TBinaryProtocol(transport);
        try {
            transport.open();
        } catch (TTransportException e) {
            throw new RuntimeException(e);
        }
        try {
            Cassandra.Client client = new Cassandra.Client(protocol);
            SlicePredicate predicate = new SlicePredicate();
            predicate.setColumn_names(Arrays.asList("postalCode".getBytes(),
                    "address".getBytes(), "addressYomi".getBytes()));

            KeyRange range = new KeyRange();
            range.setStart_key("");
            range.setEnd_key("");

            List<KeySlice> ret = client.get_range_slices(KEYSPACE,
                    new ColumnParent(COLUMN_FAMILY), predicate, range,
                    ConsistencyLevel.ONE);
            int i = 0;
            for (KeySlice keySlice : ret) {
                System.out.println((i++) + " key = " + keySlice.getKey());
                for (ColumnOrSuperColumn csc : keySlice.getColumns()) {
                    Column column = csc.getColumn();
                    String name = new String(column.getName());
                    String value = new String(column.getValue());
                    System.out.println("\t\t" + name + " -> " + value + "("
                            + column.getTimestamp() + ")");
                }
            }
        } catch (InvalidRequestException e) {
            throw new RuntimeException(e);
        } catch (UnavailableException e) {
            throw new RuntimeException(e);
        } catch (TimedOutException e) {
            throw new RuntimeException(e);
        } catch (TException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                transport.flush();
            } catch (TTransportException e) {
                throw new RuntimeException(e);
            } finally {
                transport.close();
            }
        }
    }
}

SlicePredicateについては前回ご紹介しているので,そちらをご覧ください。

このコードで新たに登場しているのは,KeyRangeとKeySliceという2つのクラスです。

KeyRange

KeyRangeは複数ロウを取得するときのレンジを表すクラスです。これには以下のようなことを設定でき,これに従って検索結果が返されます。

  • キーの開始から終了のレンジ
  • 取得する最大数
  • トークンによるレンジ

リスト1のコードでは,以下のようにキーのレンジを何も指定しないようにしています。

KeyRange range = new KeyRange();
range.setStart_key("");
range.setEnd_key("");

ちなみに,デフォルトでは100件分のデータしか取得しません。そのため,たとえば1000件分取得する場合には,以下のようにする必要があります。

KeyRange range = new KeyRange(1000);
range.setStart_key("");
range.setEnd_key("");

また,キーの開始位置と終了位置を指定する場合は以下のようになります。

KeyRange range = new KeyRange(1000);
range.setStart_key("1760000");
range.setEnd_key("1760004");

このようにキーのレンジを指定できるのですが,いくつか注意点があります(詳細は後述します)。まずは「KeyRangeでキーの取得範囲を指定できる」ことだけわかれば現段階では問題ありません。

KeySlice

次はKeySliceです。KeySliceはget_range_slicesで返される値で,取得したキーと指定されたカラムの集合を持っています。get_range_slicesでは,このKeySliceのListを返します。

取得するコードは,以下のようにKeySliceのListから1つずつ中身を表示するようになっています。

for (KeySlice keySlice : ret) {
    System.out.println((i++) + " key = " + keySlice.getKey());
    for (ColumnOrSuperColumn csc : keySlice.getColumns()) {
        Column column = csc.getColumn();
        String name = new String(column.getName());
        String value = new String(column.getValue());
        System.out.println("\t\t" + name + " -> " + value + "("
                + column.getTimestamp() + ")");
    }
}

著者プロフィール

大谷晋平(おおたにしんぺい)

オープンソースプログラマ。WebフレームワークT2の開発をしながらHadoop/NoSQLミドルウェアにも手を出す。最近ではもっぱらHadoop,Cassandra,Avro,kumofsなどに興味津々。

blog:http://d.hatena.ne.jp/shot6/

Twitter:http://twitter.com/shot6/

コメント

コメントの記入