自己投資としてチャレンジしている内容を 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 codehttps://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

▼3. Cosmos DB (SQL) で検索したデータを JSON 形式で保存するコード
3-1. ディレクトリの作成
アプリケーションを作成するため、ディレクトリを作成します。
mkidr cosmosdbtoblob
cd cosmosdbtoblob3-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.java3-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. 参考情報
- Azure Cosmos DB を無料で試す https://docs.microsoft.com/ja-jp/azure/cosmos-db/optimize-dev-test#try-azure-cosmos-db-for-free
- https://code.visualstudio.com/docs/setup/linux
- Apache Kafka Word Count 実装 – Java No.44
- Java Azure Cosmos DB (SQL API) Database の作成方法 No.14
- Java Azure Cosmos DB (SQL) 検索結果をテキストに保存 No.72
- Java Azure Cosmos DB (SQL) 検索結果を JSON ファイルに保存 No.73
以上です。参考になりましたら幸いです。