Java Azure Cosmos DB 検索結果を Azure Blob Storage に保存 No.74

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

今回は Cosmos DB (SQL API) の検索結果を JSON 形式で Azure Blob Storage へ出力する Java コードを紹介したいと思います。(In English: Java: Save the results of select on Azure Cosmos DB SQL API into Azure Blob Storage No.74)

▼1. Cosmos DB から Azure Blob Storage へのコピー

今回お伝えする Cocmos DB から Azure Blob Storage へのコピーは、実は dt.exe と dtui.exe のツールで簡単にできます。

以下のドキュメントが参考になります。今回はあえて Java で実装したいと思います。
(参考)  チュートリアル:Azure Cosmos DB のデータベース移行ツール | Microsoft Learn


▼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) で検索したデータを JSON 形式で保存するコード

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

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

mkidr cosmosdbtoblob
cd cosmosdbtoblob

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

cd cosmosdbtoblob
mvn archetype:generate  -DinteractiveMode=false -DgroupId=org.example.cosmosdb.sql -DartifactId=sqldemo -DarchetypeArtifactId=maven-archetype-quickstart
(出力の一部)

[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/cosmosdbtoblob
[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/cosmosdbtoblob/sqldemo
[INFO] -------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] -------------------------------------------------------------------
[INFO] Total time:  3.706 s
[INFO] Finished at: 2022-11-12T19:03:12+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 および Azure Blob Storage への操作のため 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>
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-identity</artifactId>
      <version>1.6.1</version>
    </dependency>
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-storage-blob</artifactId>
      <version>12.13.0</version>
    </dependency>
  </dependencies>

3-6. Cosmos DB (SQL) で検索したデータを JSON 形式で Azure Blob Storage に保存

copycosmosdbtoblob.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 com.azure.storage.blob.*;

public class copycosmosdbtoblob {
    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 = "db1";
        String endpoint = "https://xxx.documents.azure.com:443";
        String masterkey = "yourkey";
        String containerName = "coll1";

        String connectStr = "DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=yourkey;EndpointSuffix=core.windows.net";
        String blobcontainerName = "files";
        String fileName = "sample5.json";
        String localPath = "/home/xxx/cosmosdbtoblob/sqldemo/";

        // Get a reference to a container
        BlobServiceClient BlobServiceClient = new BlobServiceClientBuilder().connectionString(connectStr).buildClient();
        BlobContainerClient containerClinet = BlobServiceClient.getBlobContainerClient(blobcontainerName);

        try (CosmosClient cosmosClient = new CosmosClientBuilder().endpoint(endpoint).key(masterkey)
                .gatewayMode(GatewayConnectionConfig.getDefaultConfig()).consistencyLevel(ConsistencyLevel.SESSION)
                .connectionSharingAcrossClientsEnabled(true).contentResponseOnWriteEnabled(true)
                .userAgentSuffix("Applicationtest").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/cosmosdbtoblob/sqldemo/sample5.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("]}");
        // close printstream
        System.out.close();

    BlobClient blobClient = containerClinet.getBlobClient(fileName);

    System.out.println("Uploading to Azure Blob storage as blob:\n\t" + blobClient.getBlobUrl());

    // Upload a file to the blob
    blobClient.uploadFromFile(localPath + "/" + fileName);
    }
}

3-7. Azure Portal にアクセスし、ファイルを確認

Azure Portal から該当の blob のコンテイナーにアクセスし sample5.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
  6. Java Azure Cosmos DB (SQL) 検索結果を JSON ファイルに保存 No.73

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



コメントを残す

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