Java Azure Cosmos DB (SQL) 検索結果を JSON ファイルに保存 No.73

自己投資としてチャレンジしている内容を Blog で公開しています。

今回は前回の継続で Cosmos DB の検索結果を JSON 形式で出力する Java コードを紹介したいと思います。(In English Java – Azure Cosmos DB (SQL) : Save results of select into a JSON file No.73)

▼1. JSON 形式とは

JSON では以下のデータ型がサポートされています。

  • string
  • number
  • boolean
  • null
  • object
  • Array

また、以下のような形式で表現されます。(参考)  JSON – Wikipedia

{
    "Records": [
        {
            "id": 1,
            "lastName": "Travase",
            "isRegistered": false
        },
        {
            "id": 2,
            "lastName": "Ken",
            "isRegistered": true
        },
        {
            "id": 3,
            "lastName": "Sai",
            "isRegistered": false
        }
    ]
}

▼2. 事前準備

2-1. 無料で利用できる Azure Cosmos DB を用意

Azure を利用するために必要な Subscription を用意する必要もありません。https://azure.microsoft.com/ja-jp/try/cosmosdb/

2-2. Visual Studio Code のインストール

sudo snap install --classic code

https://code.visualstudio.com/docs/setup/linux

2-3. Maven のインストール

Apache Kafka Word Count 実装 – Java No.44
“Apache Maven のインストール” を参照

2-4. データの作成

詳細はこちらの blog を参照ください。
Java Azure Cosmos DB (SQL API) Database の作成方法 No.14

GeneratingData

▼3. Cosmos DB (SQL API) で検索したデータを JSON 形式で保存するコード

3-1. ディレクトリの作成

アプリケーションを作成するため、ディレクトリを作成します。

mkidr cosmosdbtest2
cd cosmosdbtest2

3-2. Apache Maven によるプロジェクトを作成

cd cosmosdbtest2
mvn archetype:generate  -DinteractiveMode=false -DgroupId=org.example.cosmosdb.sql -DartifactId=sqldemo -DarchetypeArtifactId=maven-archetype-quickstart
(出力の一部)
xxxx
[INFO] Scanning for projects...
[INFO] 
[INFO] ------------------< org.apache.maven:standalone-pom >--------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]----------------------------
[INFO] 
[INFO] >>> maven-archetype-plugin:3.2.0:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO] 
[INFO] <<< maven-archetype-plugin:3.2.0:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO] 
[INFO] 
[INFO] --- maven-archetype-plugin:3.2.0:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[INFO] -------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0
[INFO] -------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /home/xxx/cosmosdbtest2/sqldemo
[INFO] Parameter: package, Value: org.example.cosmosdb.sql
[INFO] Parameter: groupId, Value: org.example.cosmosdb.sql
[INFO] Parameter: artifactId, Value: sqldemo
[INFO] Parameter: packageName, Value: org.example.cosmosdb.sql
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /home/xxx/cosmosdbtest2/sqldemo
[INFO] -------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] -------------------------------------------------------------------
[INFO] Total time:  3.760 s
[INFO] Finished at: 2022-11-12T09:08:34+09:00
[INFO] -------------------------------------------------------------------

3-3. デフォルトで作成された App.java および AppTest.java を削除

rm ./sqldemo/src/main/java/org/example/comsosdb/sql/App.java
rm ./sqldemo/src/test/java/org/example/cosmosdb/sql/AppTest.java

3-4. Visual Studio Code を起動

cd ./sqldemo
code .

3-5. pom.xml に、Cosmos DB への接続および操作のため library を追記し保存 (Ctrl+S)

  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
    
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-cosmos</artifactId>
      <version>4.30.1</version>
    </dependency>
  </dependencies>

3-6. Cosmos DB (SQL API) で検索したデータを JSON 形式で保存するコードを作成

cosmosdbjsonout.java を作成します。

package org.example.cosmosdb.sql;

import com.azure.cosmos.*;
import com.azure.cosmos.models.CosmosQueryRequestOptions;
import com.azure.cosmos.util.CosmosPagedIterable;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.*;

public class cosmosdbjsonout {
 // select data from Csomos DB and save to JSON file

 public static class Family {
    public String id;
    public String lastName;
    public boolean isRegistered;

    public String getId() {
      return id;
    }

    public String getLastName() {
      return lastName;
    }

    public Family(String idv, String lastNamev, boolean isv) {
      id = idv;
      lastName = lastNamev;
      isRegistered = isv;
    }

    public String toJson(String idv, String lastNamev, boolean isv) {
      return "{\"id\":" + idv + ",\"lastName\":\"" + lastNamev + "\",\"isRegistered\":" + isv + "}";
    }

    public Family() {
    }
  }

  public static void main(String[] args) {
    String databaseName = "testdb";
    String endpoint = "https://xxx.documents.azure.com:443";
    String masterkey = "xxx";
    String containerName = "coll";

    try (CosmosClient cosmosClient = new CosmosClientBuilder().endpoint(endpoint).key(masterkey)
        .gatewayMode(GatewayConnectionConfig.getDefaultConfig()).consistencyLevel(ConsistencyLevel.SESSION)
        .connectionSharingAcrossClientsEnabled(true).contentResponseOnWriteEnabled(true)
        .userAgentSuffix("Applicationtest").preferredRegions(Collections.singletonList("East US")).buildClient()) {
      CosmosDatabase database = cosmosClient.getDatabase(databaseName);
      CosmosContainer container = database.getContainer(containerName);

      // run select query
      String query = "SELECT * FROM c";
      CosmosQueryRequestOptions options = new CosmosQueryRequestOptions();
      options.setMaxDegreeOfParallelism(2);
      CosmosPagedIterable<Family> results = container.queryItems(query, options, Family.class);
      File file = new File("/home/xxx/cosmosdbtest2/sqldemo/sample1.json");
      try {
        PrintStream ps = new PrintStream(file);
        System.setOut(ps);
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      }
     
      System.out.print("{\"Records\":[");
      for (Family result : results) {
        // if first line, no comma
        if (result.getId().equals("1")) {
          System.out.print(result.toJson(result.getId(), result.getLastName(), result.isRegistered));
        } else {
          System.out.print("," + result.toJson(result.getId(), result.getLastName(), result.isRegistered));
        }
      }
    } catch (CosmosException e) {
      e.printStackTrace();
      System.err.println(e.getMessage());
    }
    System.out.println("]}");
  }

}

3-7. 実行後 JSON ファイルが生成

sample1.json  の中身は以下のようになります。

cat sample1.json

{"Records":[{"id":1,"lastName":"Travase","isRegistered":false},{"id":2,"lastName":"Ken","isRegistered":true},{"id":3,"lastName":"Sai","isRegistered":false}]}


▼4. 参考情報

  1. Azure Cosmos DB を無料で試す https://docs.microsoft.com/ja-jp/azure/cosmos-db/optimize-dev-test#try-azure-cosmos-db-for-free
  2. https://code.visualstudio.com/docs/setup/linux
  3. Apache Kafka Word Count 実装 – Java No.44
  4. Java Azure Cosmos DB (SQL API) Database の作成方法 No.14
  5. Java Azure Cosmos DB (SQL) 検索結果をテキストに保存 No.72

以上です。参考になりましたら幸いです。



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です