Cassandra セカンダリインデックスを試す
スポンサーリンク
このドキュメントの内容は、以下の通りです。
Cassandra 1.1.0 の Cassandra のセカンダリインデックス (Secondary index) を試してみました。セカンダリインデックスとは
Cassandra の セカンダリインデックスは、column (カラム) の値に対して、インデックスを作成します。
column の値で検索することができます。
つまり、WHERE 句を使って、検索できる、ということです。
[default@k1] get c1 where class = 'x';
セカンダリインデックスの作成
keyspace k1 を作成し、 column family c1 を作成します。
column_metadata でセカンダリインデックスの指定をします。column (カラム名) class に対して、 index を作成します。
create keyspace k1; use k1; create column family c1 with comparator=UTF8Type and default_validation_class=UTF8Type and key_validation_class=UTF8Type and column_metadata = [ { column_name: class, validation_class: UTF8Type, index_type: KEYS} ];
すでに column family がある場合には、 update で設定を変更します。
update column family c1 with column_metadata = [ { column_name: class, validation_class: UTF8Type, index_type: KEYS} ];
column_metadata を column_metadate と typo して、以下のエラーが出てしまった。
java.lang.IllegalArgumentException: No enum const class org.apache.cassandra.cli.CliClient$ColumnFamilyArgument.COLUMN_METADATE
正しくは、これ。
カラム class に対して、 index を張る。
update column family c1 with column_metadata = [ { column_name: class, validation_class: UTF8Type, index_type: KEYS} ];
データを入れる
テスト用のデータを入れます。
set c1['1']['id'] = 'a'; set c1['2']['id'] = 'b'; set c1['3']['id'] = 'c'; set c1['1']['year'] = '2012'; set c1['2']['year'] = '2013'; set c1['3']['year'] = '2014'; set c1['1']['class'] = 'z'; set c1['2']['class'] = 'z'; set c1['3']['class'] = 'x';
実際に、cassandra-cli を利用して、データを入れるとこんな感じ。
% cassandra-cli -h localhost -k k1 [default@k1] set c1['1']['id'] = 'a'; Value inserted. Elapsed time: 397 msec(s). [default@k1] set c1['2']['id'] = 'b'; Value inserted. Elapsed time: 10 msec(s). [default@k1] set c1['3']['id'] = 'c'; Value inserted. Elapsed time: 5 msec(s). [default@k1] set c1['1']['year'] = '2012'; Value inserted. Elapsed time: 13 msec(s). [default@k1] set c1['2']['year'] = '2013'; Value inserted. Elapsed time: 11 msec(s). [default@k1] set c1['3']['year'] = '2014'; Value inserted. Elapsed time: 6 msec(s). [default@k1] set c1['1']['class'] = 'z'; Value inserted. Elapsed time: 10 msec(s). [default@k1] set c1['2']['class'] = 'z'; Value inserted. Elapsed time: 6 msec(s). [default@k1] set c1['3']['class'] = 'x'; Value inserted. Elapsed time: 6 msec(s).
セカンダリインデックスを利用して、値を得る
get に WHERE 句を指定して、値を取り出してみます。
[default@k1] get c1 where class = 'x'; ------------------- RowKey: 3 => (column=class, value=x, timestamp=1342284829642000) => (column=id, value=c, timestamp=1342284723520000) => (column=year, value=2014, timestamp=1342284756153000) 1 Row Returned. Elapsed time: 97 msec(s). [default@k1] get c1 where class = 'z'; ------------------- RowKey: 2 => (column=class, value=z, timestamp=1342284824564000) => (column=id, value=b, timestamp=1342284718687000) => (column=year, value=2013, timestamp=1342284751760000) ------------------- RowKey: 1 => (column=class, value=z, timestamp=1342284819708000) => (column=id, value=a, timestamp=1342284712849000) => (column=year, value=2012, timestamp=1342284744128000) 2 Rows Returned. Elapsed time: 38 msec(s).
セカンダリインデックスが作成されていない場合
セカンダリインデックスを用意してない場合には、
以下のエラーが出ます。
[default@k1] get c1 where id = 'foo'; No indexed columns present in index clause with operator EQ
細かい検索条件
これまでの例では、WHERE 句に class しか指定しませんでした。
column class, year に index を作成してみます。
update column family c1 with column_metadata = [ { column_name: class, validation_class: UTF8Type, index_type: KEYS}, { column_name: year, validation_class: UTF8Type, index_type: KEYS} ];
class だけで検索すると2件だけ、出てきます。
[default@k1] get c1 where class='z'; ------------------- RowKey: 2 => (column=class, value=z, timestamp=1342284824564000) => (column=id, value=b, timestamp=1342284718687000) => (column=year, value=2013, timestamp=1342284751760000) ------------------- RowKey: 1 => (column=class, value=z, timestamp=1342284819708000) => (column=id, value=a, timestamp=1342284712849000) => (column=year, value=2012, timestamp=1342284744128000) 2 Rows Returned. Elapsed time: 39 msec(s).
year でさらに絞込みをしてみます。
[default@k1] get c1 where class='z' and year > 2013; 0 Row Returned. Elapsed time: 26 msec(s). [default@k1] get c1 where class='z' and year > 2012; ------------------- RowKey: 2 => (column=class, value=z, timestamp=1342284824564000) => (column=id, value=b, timestamp=1342284718687000) => (column=year, value=2013, timestamp=1342284751760000) 1 Row Returned. Elapsed time: 22 msec(s).
以上のように、セカンダリインデックスを利用すると、値で検索することができます。
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12