Symfoware

Symfowareについての考察blog

GridDBにJavaクライアントから接続し、クエリーを実行する

GridDBをCentOS 7.2にインストールしました。
GridDBをCentOS 7.2にインストール

Javaクライアントから接続する方法をメモしておきます。


接続クライアントのビルド



こちらの手順に沿って実行します。
https://github.com/griddb/griddb_nosql

JDKとantは事前にインストールしておきました。

gitでソースを取得。


$ git clone https://github.com/griddb/griddb_nosql.git




antでビルドを実行します。


$ cd griddb_nosql/
$ ant -f java_client/build.xml




griddb_nosql/binに2つのjarファイルが出力されます。
・gridstore.jar
・gridstore-conf.jar

これに加え、
griddb_nosql/3rd_party/slf4jにある2つのjarファイル
・slf4j-api-1.7.7.jar
・slf4j-jdk14-1.7.7.jar


以下のパスの設定ファイル
griddb_nosql/java_client/example/config/gs_client.properties

これらをビルドパスに含めておきます。

678_01.png



簡単なサンプル



サンプルコードのままですが、プログラムはこんな感じになります。


  1. package sample;
  2. import java.util.Properties;
  3. import com.toshiba.mwcloud.gs.Collection;
  4. import com.toshiba.mwcloud.gs.GSException;
  5. import com.toshiba.mwcloud.gs.GridStore;
  6. import com.toshiba.mwcloud.gs.GridStoreFactory;
  7. import com.toshiba.mwcloud.gs.Query;
  8. import com.toshiba.mwcloud.gs.RowKey;
  9. import com.toshiba.mwcloud.gs.RowSet;
  10. public class Sample1 {
  11.     
  12.     // 保存するオブジェクトの定義
  13.     static class Person {
  14.         @RowKey String name;
  15.         boolean status;
  16.         long count;
  17.         String value;
  18.     }
  19.     
  20.     public static void main(String[] args) throws GSException {
  21.         
  22.         // GridDBへの接続指定
  23.         Properties props = new Properties();
  24.         props.setProperty("notificationAddress", "239.0.0.1");
  25.         props.setProperty("notificationPort", "31999");
  26.         props.setProperty("clusterName", "my_cluster");
  27.         props.setProperty("user", "admin");
  28.         props.setProperty("password", "P@ssw0rd");
  29.         GridStore store = GridStoreFactory.getInstance().getGridStore(props);
  30.         
  31.         
  32.         // col01というコレクションを作成
  33.         // この時、保存するオブジェクトの形式も合わせて指定する
  34.         Collection<String, Person> col = store.putCollection("col01", Person.class);
  35.         // name,count列にインデックスを作成
  36.         col.createIndex("name");
  37.         col.createIndex("count");
  38.         // 自動保存を無効に
  39.         col.setAutoCommit(false);
  40.         // 保存するオブジェクトを作成
  41.         Person person = new Person();
  42.         person.name = "name01";
  43.         person.status = false;
  44.         person.count = 1;
  45.         person.value = "日本語テスト";
  46.         // データを保存
  47.         col.put(person);
  48.         
  49.         // 更新可能な状態でデータを取得
  50.         boolean update = true;
  51.         person = col.get(person.name, update);
  52.         
  53.         // データの削除
  54.         // update = trueでロックをかけてデータを取得したので削除できる
  55.         col.remove(person.name);
  56.         // 別の名前で登録
  57.         col.put("name02", person);
  58.         // 変更を確定
  59.         col.commit();
  60.         // データを取得
  61.         Query<Person> query = col.query("select * where name = 'name02'");
  62.         // 検索結果のフェッチ開始
  63.         // update = trueでロックをかけているため、更新可能
  64.         RowSet<Person> rs = query.fetch(update);
  65.         while (rs.hasNext()) {
  66.             Person person1 = rs.next();
  67.             
  68.             // ここでデータの更新も行える
  69.             person1.count += 1;
  70.             rs.update(person1);
  71.             System.out.println("Person: " +
  72.                     " name=" + person1.name +
  73.                     " status=" + person1.status +
  74.                     " count=" + person1.count +
  75.                     " value=" + person1.value);
  76.         }
  77.         // 変更を確定
  78.         col.commit();
  79.         
  80.         // 作成したコレクションを削除
  81.         store.dropCollection("col01");
  82.         // 接続終了
  83.         store.close();
  84.     }
  85. }




実行するとこんな出力が得られました。


Person: name=name02 status=false count=2 value=日本語テスト





コレクションを作成した時と異なるオプジェクトを保存しようとすると
以下のエラーが発生します。


Exception in thread "main" com.toshiba.mwcloud.gs.common.GSStatementException: [60016:DS_DS_CHANGE_SCHEMA_DISABLE] (address=/192.168.1.102:10001, partitionId=88)
    at com.toshiba.mwcloud.gs.subnet.NodeConnection.executeStatementDirect(NodeConnection.java:460)
    at com.toshiba.mwcloud.gs.subnet.NodeConnection.executeStatement(NodeConnection.java:278)
    at com.toshiba.mwcloud.gs.subnet.GridStoreChannel.executeStatement(GridStoreChannel.java:1401)
    at com.toshiba.mwcloud.gs.subnet.SubnetGridStore.executeStatement(SubnetGridStore.java:169)
    at com.toshiba.mwcloud.gs.subnet.SubnetGridStore.putContainer(SubnetGridStore.java:769)
    at com.toshiba.mwcloud.gs.subnet.SubnetGridStore.putCollection(SubnetGridStore.java:801)
    at com.toshiba.mwcloud.gs.subnet.SubnetGridStore.putCollection(SubnetGridStore.java:627)
    at com.toshiba.mwcloud.gs.subnet.SubnetGridStore.putCollection(SubnetGridStore.java:85)
    at sample.Sample1.main(Sample1.java:33)




一旦コレクションを削除して再定義すればOKでした。


  1. store.dropCollection("col01");








郵便番号の登録と検索



サンプルとして、郵便番号の登録と検索を行ってみます。
データはこちらから取得しました。
郵便番号データダウンロード


郵便番号は重複がありますが、無視して上書き保存することにします。
サンプルはこんな感じ。


  1. package sample;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.nio.charset.Charset;
  5. import java.nio.file.Files;
  6. import java.nio.file.Path;
  7. import java.util.Properties;
  8. import com.toshiba.mwcloud.gs.Collection;
  9. import com.toshiba.mwcloud.gs.GridStore;
  10. import com.toshiba.mwcloud.gs.GridStoreFactory;
  11. import com.toshiba.mwcloud.gs.RowKey;
  12. public class PostInsert {
  13.     
  14.     // 保存するオブジェクトの定義
  15.     static class Post {
  16.         @RowKey String code;
  17.         String address;
  18.     }
  19.     
  20.     private static String sunit(String value) {
  21.         return value.substring(1, value.length() - 1);
  22.     }
  23.     
  24.     public static void main(String[] args) throws Exception {
  25.         
  26.         // GridDBへの接続指定
  27.         Properties props = new Properties();
  28.         props.setProperty("notificationAddress", "239.0.0.1");
  29.         props.setProperty("notificationPort", "31999");
  30.         props.setProperty("clusterName", "my_cluster");
  31.         props.setProperty("user", "admin");
  32.         props.setProperty("password", "P@ssw0rd");
  33.         GridStore store = GridStoreFactory.getInstance().getGridStore(props);
  34.         
  35.         
  36.         // コレクションを作成
  37.         Collection<String, Post> col = store.putCollection("postcode", Post.class);
  38.         // code列にインデックスを作成
  39.         col.createIndex("code");
  40.         // 自動保存を無効に
  41.         col.setAutoCommit(false);
  42.         // 保存するオブジェクトを作成
  43.         Post post = new Post();
  44.         
  45.         int count = 0;
  46.         // ファイル読み込み
  47.         Path src = new File("/home/baranche/workspace/griddb/src/KEN_ALL.CSV").toPath();
  48.         try (BufferedReader br = Files.newBufferedReader(src, Charset.forName("MS932"))) {
  49.             String line = null;
  50.             while((line = br.readLine()) != null) {
  51.                 String[] data = line.split(",");
  52.                 
  53.                 post.code = sunit(data[2]);
  54.                 post.address = sunit(data[6]) + sunit(data[7]) + sunit(data[8]);
  55.                 
  56.                 // データを保存
  57.                 col.put(post);
  58.                 count++;
  59.             }
  60.         }
  61.         
  62.         System.out.println(count);
  63.         // 変更を確定
  64.         col.commit();
  65.         // 接続終了
  66.         store.close();
  67.         
  68.     }
  69.     
  70. }





検索のサンプルはこうなります。


  1. package sample;
  2. import java.util.Properties;
  3. import com.toshiba.mwcloud.gs.Collection;
  4. import com.toshiba.mwcloud.gs.GridStore;
  5. import com.toshiba.mwcloud.gs.GridStoreFactory;
  6. import com.toshiba.mwcloud.gs.Query;
  7. import com.toshiba.mwcloud.gs.RowKey;
  8. import com.toshiba.mwcloud.gs.RowSet;
  9. public class PostSearch {
  10.     // 保存するオブジェクトの定義
  11.     static class Post {
  12.         @RowKey String code;
  13.         String address;
  14.     }
  15.     
  16.     public static void main(String[] args) throws Exception {
  17.         
  18.         // GridDBへの接続指定
  19.         Properties props = new Properties();
  20.         props.setProperty("notificationAddress", "239.0.0.1");
  21.         props.setProperty("notificationPort", "31999");
  22.         props.setProperty("clusterName", "my_cluster");
  23.         props.setProperty("user", "admin");
  24.         props.setProperty("password", "P@ssw0rd");
  25.         GridStore store = GridStoreFactory.getInstance().getGridStore(props);
  26.         
  27.         // コレクションを取得
  28.         Collection<String, Post> col = store.getCollection("postcode", Post.class);
  29.         // 郵便番号検索
  30.         Query<Post> query = col.query("select * where code = '0028071'");
  31.         RowSet<Post> rs = query.fetch();
  32.         while (rs.hasNext()) {
  33.             Post post = rs.next();
  34.             
  35.             System.out.print("code:" + post.code);
  36.             System.out.println(" address:" + post.address);
  37.             
  38.         }
  39.         // 接続終了
  40.         store.close();
  41.         
  42.     }
  43. }




ちゃんと郵便番号で検索できました。


code:0028071 address:北海道札幌市北区あいの里一条








住所であいまい検索



比較演算子にはlikeが使用できるようです。
住所に「銀座」を含む住所を検索しています。


  1. package sample;
  2. import java.util.Properties;
  3. import com.toshiba.mwcloud.gs.Collection;
  4. import com.toshiba.mwcloud.gs.GridStore;
  5. import com.toshiba.mwcloud.gs.GridStoreFactory;
  6. import com.toshiba.mwcloud.gs.Query;
  7. import com.toshiba.mwcloud.gs.RowKey;
  8. import com.toshiba.mwcloud.gs.RowSet;
  9. public class PostSearch {
  10.     // 保存するオブジェクトの定義
  11.     static class Post {
  12.         @RowKey String code;
  13.         String address;
  14.     }
  15.     
  16.     public static void main(String[] args) throws Exception {
  17.         
  18.         // GridDBへの接続指定
  19.         Properties props = new Properties();
  20.         props.setProperty("notificationAddress", "239.0.0.1");
  21.         props.setProperty("notificationPort", "31999");
  22.         props.setProperty("clusterName", "my_cluster");
  23.         props.setProperty("user", "admin");
  24.         props.setProperty("password", "P@ssw0rd");
  25.         GridStore store = GridStoreFactory.getInstance().getGridStore(props);
  26.         
  27.         // コレクションを取得
  28.         Collection<String, Post> col = store.getCollection("postcode", Post.class);
  29.         // 郵便番号検索
  30.         Query<Post> query = col.query("select * where address like '%銀座%'");
  31.         RowSet<Post> rs = query.fetch();
  32.         while (rs.hasNext()) {
  33.             Post post = rs.next();
  34.             
  35.             System.out.print("code:" + post.code);
  36.             System.out.println(" address:" + post.address);
  37.             
  38.         }
  39.         // 接続終了
  40.         store.close();
  41.         
  42.     }
  43. }




狙い通りの結果が得られました。


code:0691331 address:北海道夕張郡長沼町銀座
code:3220052 address:栃木県鹿沼市銀座
code:3600032 address:埼玉県熊谷市銀座
code:3670052 address:埼玉県本庄市銀座
code:1040061 address:東京都中央区銀座
code:9300991 address:富山県富山市新庄銀座
code:3940022 address:長野県岡谷市銀座
code:3940023 address:長野県岡谷市東銀座
code:3950031 address:長野県飯田市銀座
code:4240817 address:静岡県静岡市清水区銀座
code:4130013 address:静岡県熱海市銀座町
code:4140028 address:静岡県伊東市銀座元町
code:4750874 address:愛知県半田市銀座本町
code:4480845 address:愛知県刈谷市銀座
code:5220088 address:滋賀県彦根市銀座町
code:6128089 address:京都府京都市伏見区銀座町
code:7450032 address:山口県周南市銀座
code:7450033 address:山口県周南市みなみ銀座
code:7700916 address:徳島県徳島市銀座
code:8040076 address:福岡県北九州市戸畑区銀座



関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/03/06(日) 14:50:51|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<GridDB TimeSeriesなコレクションからデータを取得する | ホーム | GridDBをCentOS 7.2にインストール>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1864-10cf7f76
この記事にトラックバックする(FC2ブログユーザー)