{"id":8360,"date":"2024-07-18T07:00:40","date_gmt":"2024-07-18T14:00:40","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/cosmosdb\/?p=8360"},"modified":"2024-07-29T05:42:43","modified_gmt":"2024-07-29T12:42:43","slug":"latest-nosql-java-ecosystem-updates-2024-q1-q2","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/cosmosdb\/latest-nosql-java-ecosystem-updates-2024-q1-q2\/","title":{"rendered":"Latest NoSQL Java Ecosystem Updates 2024 Q1 &#038; Q2"},"content":{"rendered":"<p class=\"code-line\" dir=\"auto\" data-line=\"0\">We\u2019re always busy adding new features, fixes, patches, and improvements to our\u00a0<a href=\"https:\/\/devblogs.microsoft.com\/cosmosdb\/azure-cosmos-db-java-ecosystem\/\" target=\"_blank\" rel=\"noopener\">Java-based client libraries for Azure Cosmos DB for NoSQL<\/a>. In this regular blog series, we share highlights of recent updates in the last period.<\/p>\n<h2 id=\"january-june-2023-updates\">January \u2013 June 2024 updates<\/h2>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"2\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"2\"><a title=\"#java-sdk-updates\" href=\"#java-sdk-updates\" data-href=\"#java-sdk-updates\">Java SDK Updates<\/a>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"3\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"3\"><a title=\"#integrate-throughputcontrol-with-changefeedprocessor\" href=\"#integrate-throughputcontrol-with-changefeedprocessor\" data-href=\"#integrate-throughputcontrol-with-changefeedprocessor\">Integrate ThroughputControl with ChangeFeedProcessor<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"4\"><a title=\"#added-payload-size-metrics-for-gateway-mode\" href=\"#added-payload-size-metrics-for-gateway-mode\" data-href=\"#added-payload-size-metrics-for-gateway-mode\">Added Payload Size Metrics for Gateway Mode<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"5\"><a title=\"#overloads-for-readmany-with-request-options\" href=\"#overloads-for-readmany-with-request-options\" data-href=\"#overloads-for-readmany-with-request-options\">Overloads for\u00a0<code>readMany<\/code>\u00a0with Request Options<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"6\"><a title=\"#public-apis-for-microbatch-size-in-cosmosbulkexecutionoptions\" href=\"#public-apis-for-microbatch-size-in-cosmosbulkexecutionoptions\" data-href=\"#public-apis-for-microbatch-size-in-cosmosbulkexecutionoptions\">Public APIs for MicroBatch Size in CosmosBulkExecutionOptions<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"7\"><a title=\"#custom-item-serializer\" href=\"#custom-item-serializer\" data-href=\"#custom-item-serializer\">Custom Item Serializer<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"8\"><a title=\"#vector-embedding-policy-and-indexes-for-vector-search\" href=\"#vector-embedding-policy-and-indexes-for-vector-search\" data-href=\"#vector-embedding-policy-and-indexes-for-vector-search\">Vector Embedding Policy and Indexes for Vector Search<\/a><\/li>\n<li dir=\"auto\" data-line=\"8\"><a href=\"#support-for-non-streaming-orderby\">Support for Non-streaming OrderBy<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"9\"><a title=\"#regional-scope-for-session-tokens\" href=\"#regional-scope-for-session-tokens\" data-href=\"#regional-scope-for-session-tokens\">Regional Scope for Session Tokens<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"10\"><a title=\"#query-statement-in-diagnostics-and-tracing\" href=\"#query-statement-in-diagnostics-and-tracing\" data-href=\"#query-statement-in-diagnostics-and-tracing\">Query Statement in Diagnostics and Tracing<\/a><\/li>\n<\/ul>\n<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"11\"><a title=\"#spring-connector-updates\" href=\"#spring-connector-updates\" data-href=\"#spring-connector-updates\">Spring Connector Updates<\/a>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"12\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"12\"><a title=\"#indexquerymetrics-in-configuration\" href=\"#indexquerymetrics-in-configuration\" data-href=\"#indexquerymetrics-in-configuration\">IndexQueryMetrics in Configuration<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"13\"><a title=\"#support-for-transient-annotation\" href=\"#support-for-transient-annotation\" data-href=\"#support-for-transient-annotation\">Support for Transient Annotation<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"14\"><a title=\"#hierarchical-partition-key-support\" href=\"#hierarchical-partition-key-support\" data-href=\"#hierarchical-partition-key-support\">Hierarchical Partition Key Support<\/a><\/li>\n<\/ul>\n<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"15\"><a title=\"#spark-connector-updates\" href=\"#spark-connector-updates\" data-href=\"#spark-connector-updates\">Spark Connector Updates<\/a>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"16\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"16\"><a title=\"#configurable-connection-pool-size\" href=\"#configurable-connection-pool-size\" data-href=\"#configurable-connection-pool-size\">Configurable Connection Pool Size<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"17\"><a title=\"#optimization-for-readmany-queries\" href=\"#optimization-for-readmany-queries\" data-href=\"#optimization-for-readmany-queries\">Optimization for\u00a0<code>readMany<\/code>\u00a0Queries<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"18\"><a title=\"#custom-schema-support-for-nested-properties\" href=\"#custom-schema-support-for-nested-properties\" data-href=\"#custom-schema-support-for-nested-properties\">Custom Schema Support for Nested Properties<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"19\"><a title=\"#reuse-cosmosasyncclient-for-spark-applications\" href=\"#reuse-cosmosasyncclient-for-spark-applications\" data-href=\"#reuse-cosmosasyncclient-for-spark-applications\">Reuse CosmosAsyncClient for Spark Applications<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"20\"><a title=\"#spark-35-support\" href=\"#spark-35-support\" data-href=\"#spark-35-support\">Spark 3.5 Support<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"21\"><a title=\"#native-netty-transport\" href=\"#native-netty-transport\" data-href=\"#native-netty-transport\">Native Netty Transport<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"22\"><a title=\"#managedidentity-authentication-in-databricks\" href=\"#managedidentity-authentication-in-databricks\" data-href=\"#managedidentity-authentication-in-databricks\">ManagedIdentity Authentication in Databricks<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"23\"><a title=\"#support-for-access-tokens-via-accountdataresolver\" href=\"#support-for-access-tokens-via-accountdataresolver\" data-href=\"#support-for-access-tokens-via-accountdataresolver\">Support for Access Tokens via AccountDataResolver<\/a><\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"24\"><a title=\"#spn-authentication-with-certificates\" href=\"#spn-authentication-with-certificates\" data-href=\"#spn-authentication-with-certificates\">SPN Authentication with Certificates<\/a><\/li>\n<\/ul>\n<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"25\"><a title=\"#kafka-connector-updates\" href=\"#kafka-connector-updates\" data-href=\"#kafka-connector-updates\">Kafka Connector Updates<\/a>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"26\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"26\"><a title=\"#major-v2-release\" href=\"#major-v2-release\" data-href=\"#major-v2-release\">Major V2 Release<\/a><\/li>\n<\/ul>\n<\/li>\n<li><a title=\"#kafka-connector-updates\" href=\"#fixes-patches-and-enhancements\" data-href=\"#kafka-connector-updates\">Fixes, patches, enhancements<\/a><\/li>\n<\/ul>\n<h2 id=\"java-sdk-updates\" class=\"code-line\" dir=\"auto\" data-line=\"28\">Java SDK Updates<\/h2>\n<h3 id=\"integrate-throughputcontrol-with-changefeedprocessor\" class=\"code-line\" dir=\"auto\" data-line=\"30\">Integrate ThroughputControl with ChangeFeedProcessor<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"31\"><strong>Date:<\/strong>\u00a0January 3, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38052\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38052\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38052\">#38052<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"34\">This feature introduces local ThroughputControl for ChangeFeedProcessor (CFP), which provides an easy way for customers to start using <a href=\"https:\/\/learn.microsoft.com\/azure\/cosmos-db\/nosql\/throughput-control-spark\" target=\"_blank\" rel=\"noopener\">throughput control<\/a> without any extra resource provisioning. By integrating throughput control with CFP, users can set a low priority for the change feed processor workload, ensuring that it does not impact other workloads running in parallel. This prevents heavy throttling during times of high request unit (RU) usage.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"36\"><strong>Example Usage:<\/strong><\/p>\n<pre><code class=\"code-line language-java\" dir=\"auto\" data-line=\"37\"><span class=\"hljs-type\">ThroughputControlGroupConfig<\/span> <span class=\"hljs-variable\">throughputControlGroupConfig<\/span> <span class=\"hljs-operator\">=<\/span> \r\n    <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">ThroughputControlGroupConfigBuilder<\/span>()\r\n        .groupName(<span class=\"hljs-string\">\"cfp\"<\/span>)\r\n        .targetThroughput(<span class=\"hljs-number\">300<\/span>)\r\n        .priorityLevel(PriorityLevel.LOW)\r\n        .build();\r\n\r\n<span class=\"hljs-type\">ChangeFeedProcessor<\/span> <span class=\"hljs-variable\">changeFeedProcessor<\/span> <span class=\"hljs-operator\">=<\/span>\r\n    <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">ChangeFeedProcessorBuilder<\/span>()\r\n        .hostName(<span class=\"hljs-string\">\"test\"<\/span>)\r\n        .feedContainer(feedContainer)\r\n        .leaseContainer(leaseContainer)\r\n        .handleChanges(docs -&gt; {\r\n            System.out.println(docs.size());\r\n        })\r\n        .options(\r\n            <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">ChangeFeedProcessorOptions<\/span>()\r\n                .setFeedPollThroughputControlConfig(throughputControlGroupConfig)\r\n                .setStartFromBeginning(<span class=\"hljs-literal\">true<\/span>)\r\n        )\r\n        .buildChangeFeedProcessor();\r\n<\/code><\/pre>\n<h3 id=\"added-payload-size-metrics-for-gateway-mode\" class=\"code-line\" dir=\"auto\" data-line=\"61\">Added Payload Size Metrics for Gateway Mode<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"62\"><strong>Date:<\/strong>\u00a0February 8, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38517\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38517\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38517\">#38517<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"65\">This update adds metrics for request and response payload sizes in Gateway mode. By monitoring these metrics (<code>cosmos.client.req.reqPayloadSize<\/code>\u00a0and\u00a0<code>cosmos.client.req.rspPayloadSize<\/code>), developers can better understand and optimize data transfer, which is crucial for managing costs and ensuring efficient performance.<\/p>\n<h3 id=\"overloads-for-readmany-with-request-options\" class=\"code-line\" dir=\"auto\" data-line=\"67\">Overloads for\u00a0<code>readMany<\/code>\u00a0with Request Options<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"68\"><strong>Date:<\/strong>\u00a0February 20, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38821\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38821\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38821\">#38821<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"71\">New overloads for\u00a0<code>CosmosAsyncContainer.readMany<\/code>\u00a0and\u00a0<code>CosmosContainer.readMany<\/code>\u00a0allow specifying additional request options such as excluded regions, diagnostics thresholds, and end-to-end timeout. This provides greater flexibility and control over read operations, improving the ability to manage and optimize cross-region data access.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"73\"><strong>Example Usage:<\/strong><\/p>\n<pre><code class=\"code-line language-java\" dir=\"auto\" data-line=\"74\">List&lt;CosmosItemIdentity&gt; itemIdentityList = Arrays.asList(\r\n    <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">CosmosItemIdentity<\/span>(<span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">PartitionKey<\/span>(<span class=\"hljs-string\">\"mypk1\"<\/span>), <span class=\"hljs-string\">\"item1\"<\/span>),\r\n    <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">CosmosItemIdentity<\/span>(<span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">PartitionKey<\/span>(<span class=\"hljs-string\">\"mypk2\"<\/span>), <span class=\"hljs-string\">\"item2\"<\/span>)\r\n);\r\n<span class=\"hljs-type\">CosmosReadManyRequestOptions<\/span> <span class=\"hljs-variable\">options<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">CosmosReadManyRequestOptions<\/span>()\r\n    .setExcludedRegions(Collections.singletonList(<span class=\"hljs-string\">\"region1\"<\/span>));\r\n\r\nCosmosPagedIterable&lt;MyItem&gt; items = container.readMany(itemIdentityList, options, MyItem.class);\r\n<\/code><\/pre>\n<h3 id=\"public-apis-for-microbatch-size-in-cosmosbulkexecutionoptions\" class=\"code-line\" dir=\"auto\" data-line=\"85\">Public APIs for MicroBatch Size in CosmosBulkExecutionOptions<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"86\"><strong>Date:<\/strong>\u00a0March 25, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39335\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39335\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39335\">#39335<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"89\">This feature makes the\u00a0<code>setMaxMicroBatchSize<\/code>\u00a0and\u00a0<code>getMaxMicroBatchSize<\/code>\u00a0APIs public in\u00a0<code>CosmosBulkExecutionOptions<\/code>, allowing developers to customize the maximum batch size for bulk operations. This is particularly useful for optimizing throughput and performance based on specific workload characteristics.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"91\"><strong>Example Usage:<\/strong><\/p>\n<pre><code class=\"code-line language-java\" dir=\"auto\" data-line=\"92\"><span class=\"hljs-type\">CosmosBulkExecutionOptions<\/span> <span class=\"hljs-variable\">options<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">CosmosBulkExecutionOptions<\/span>()\r\n    .setMaxMicroBatchSize(<span class=\"hljs-number\">50<\/span>);\r\n<\/code><\/pre>\n<h3 id=\"custom-item-serializer\" class=\"code-line\" dir=\"auto\" data-line=\"97\">Custom Item Serializer<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"98\"><strong>Date:<\/strong>\u00a0April 27, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38997\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38997\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38997\">#38997<\/a>,\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39933\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39933\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39933\">#39933<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"101\">Introduces new APIs\u00a0<code>getCustomItemSerializer<\/code>\u00a0and\u00a0<code>setCustomItemSerializer<\/code>\u00a0to enable custom payload transformations and serialization settings. These APIs allow developers to extend the built-in serialization, providing greater flexibility for handling complex data formats and custom transformations.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"103\"><strong>Example Usage:<\/strong><\/p>\n<pre><code class=\"code-line language-java\" dir=\"auto\" data-line=\"104\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">MyCustomSerializer<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title class_\">CosmosItemSerializer<\/span> {\r\n    <span class=\"hljs-meta\">@Override<\/span>\r\n    <span class=\"hljs-keyword\">public<\/span> Map&lt;String, Object&gt; <span class=\"hljs-title function_\">serialize<\/span><span class=\"hljs-params\">(Object item)<\/span> {\r\n        <span class=\"hljs-comment\">\/\/ Custom serialization logic here<\/span>\r\n        Map&lt;String, Object&gt; map = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">HashMap<\/span>&lt;&gt;();\r\n        <span class=\"hljs-comment\">\/\/ Custom serialization logic<\/span>\r\n        <span class=\"hljs-keyword\">return<\/span> map;\r\n    }\r\n\r\n    <span class=\"hljs-meta\">@Override<\/span>\r\n    <span class=\"hljs-keyword\">public<\/span> &lt;T&gt; T <span class=\"hljs-title function_\">deserialize<\/span><span class=\"hljs-params\">(Map&lt;String, Object&gt; jsonNodeMap, Class&lt;T&gt; classType)<\/span> {\r\n        <span class=\"hljs-comment\">\/\/ Custom deserialization logic here<\/span>\r\n        <span class=\"hljs-keyword\">return<\/span> classType.newInstance();\r\n    }\r\n}\r\n\r\n<span class=\"hljs-type\">CosmosClientBuilder<\/span> <span class=\"hljs-variable\">clientBuilder<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">CosmosClientBuilder<\/span>()\r\n    .setCustomSerializer(<span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">MyCustomSerializer<\/span>());\r\n<\/code><\/pre>\n<h3 id=\"vector-embedding-policy-and-indexes-for-vector-search\" class=\"code-line\" dir=\"auto\" data-line=\"125\">Vector Embedding Policy and Indexes for Vector Search<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"126\"><strong>Date:<\/strong>\u00a0May 19, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39379\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39379\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39379\">#39379<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"129\">Enhances container properties to support <a href=\"https:\/\/learn.microsoft.com\/azure\/cosmos-db\/gen-ai\/vector-search-overview\" target=\"_blank\" rel=\"noopener\">vector searches<\/a> by adding vector embedding policies and vector indexes. This feature enables Vector Similarity Search in Cosmos DB, providing capabilities for building GenAI applications that rely on vector operations for tasks such as recommendations, image searches, and natural language processing. Check out our <a href=\"https:\/\/github.com\/microsoft\/AzureDataRetrievalAugmentedGenerationSamples\" target=\"_blank\" rel=\"noopener\">RAG samples repo<\/a> for building Java RAG applications <a href=\"https:\/\/github.com\/microsoft\/AzureDataRetrievalAugmentedGenerationSamples\/tree\/main\/Java\/CosmosDB-NoSQL-VectorSearch\" target=\"_blank\" rel=\"noopener\">with Java SDK<\/a> and <a href=\"https:\/\/github.com\/microsoft\/AzureDataRetrievalAugmentedGenerationSamples\/tree\/main\/Java\/CosmosDB-NoSQL-Langchain\" target=\"_blank\" rel=\"noopener\">Langchain for Java<\/a> in Azure Cosmos DB.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"131\"><strong>Sample JSON Configuration:<\/strong><\/p>\n<pre><code class=\"code-line language-json\" dir=\"auto\" data-line=\"132\"><span class=\"hljs-punctuation\">{<\/span>\r\n    <span class=\"hljs-attr\">\"id\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"1d14c70a-e60e-489a-afbc-bf3193fae4b9\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n    <span class=\"hljs-attr\">\"vectorEmbeddingPolicy\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n        <span class=\"hljs-attr\">\"vectorEmbeddings\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span>\r\n            <span class=\"hljs-punctuation\">{<\/span>\r\n                <span class=\"hljs-attr\">\"path\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"\/vector1\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n                <span class=\"hljs-attr\">\"dataType\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"float32\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n                <span class=\"hljs-attr\">\"dimensions\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">3<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n                <span class=\"hljs-attr\">\"distanceFunction\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"cosine\"<\/span>\r\n            <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n            <span class=\"hljs-punctuation\">{<\/span>\r\n                <span class=\"hljs-attr\">\"path\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"\/vector2\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n                <span class=\"hljs-attr\">\"dataType\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"int8\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n                <span class=\"hljs-attr\">\"dimensions\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">3<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n                <span class=\"hljs-attr\">\"distanceFunction\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"dotproduct\"<\/span>\r\n            <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n            <span class=\"hljs-punctuation\">{<\/span>\r\n                <span class=\"hljs-attr\">\"path\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"\/vector3\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n                <span class=\"hljs-attr\">\"dataType\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"uint8\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n                <span class=\"hljs-attr\">\"dimensions\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">3<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n                <span class=\"hljs-attr\">\"distanceFunction\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"euclidean\"<\/span>\r\n            <span class=\"hljs-punctuation\">}<\/span>\r\n        <span class=\"hljs-punctuation\">]<\/span>\r\n    <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n    <span class=\"hljs-attr\">\"indexingPolicy\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">{<\/span>\r\n        <span class=\"hljs-attr\">\"vectorIndexes\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-punctuation\">[<\/span>\r\n            <span class=\"hljs-punctuation\">{<\/span>\r\n                <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"flat\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n                <span class=\"hljs-attr\">\"path\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"\/vector1\"<\/span>\r\n            <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n            <span class=\"hljs-punctuation\">{<\/span>\r\n                <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"quantizedFlat\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n                <span class=\"hljs-attr\">\"path\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"\/vector2\"<\/span>\r\n            <span class=\"hljs-punctuation\">}<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n            <span class=\"hljs-punctuation\">{<\/span>\r\n                <span class=\"hljs-attr\">\"type\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"diskANN\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n                <span class=\"hljs-attr\">\"path\"<\/span><span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"\/vector3\"<\/span>\r\n            <span class=\"hljs-punctuation\">}<\/span>\r\n        <span class=\"hljs-punctuation\">]<\/span>\r\n    <span class=\"hljs-punctuation\">}<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span>\r\n\r\n\r\n<\/code><\/pre>\n<h3 dir=\"auto\" data-line=\"126\">Support for Non-streaming OrderBy<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"126\"><strong>Date:<\/strong>\u00a0May 19, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39379\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39897\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39379\">#39897<\/a><\/p>\n<div>\n<div>Added a non-streaming OrderBy query mode, crucial for vector search capabilities.<\/div>\n<div><\/div>\n<\/div>\n<p><strong>Example Query:<\/strong><\/p>\n<pre class=\"prettyprint language-java\"><code class=\"language-java\">public Iterable&lt;Recipe&gt; vectorSearch(List&lt;Double&gt; vector){\r\n    ArrayList&lt;SqlParameter&gt; paramList = new ArrayList&lt;SqlParameter&gt;();\r\n    paramList.add(new SqlParameter(\"@embedding\", vector.stream().map(aDouble -&gt; (Float) (float) aDouble.doubleValue()).collect(Collectors.toList()).toArray()));\r\n    SqlQuerySpec querySpec = new SqlQuerySpec(\"SELECT TOP 3 c.name, c.description, c.embedding, c.cuisine, c.difficulty, c.prepTime, c.cookTime, c.totalTime, c.servings, c.ingredients, c.instructions,  VectorDistance(c.embedding,@embedding) AS SimilarityScore \u202f FROM c ORDER BY VectorDistance(c.embedding,@embedding)\", paramList);\r\n    ArrayList&lt;Recipe&gt; filteredRecipes = (ArrayList&lt;Recipe&gt;) container.queryItems(querySpec, new CosmosQueryRequestOptions(), Recipe.class).collectList().block();\r\n    return filteredRecipes;\r\n}<\/code><\/pre>\n<div>\n<div><\/div>\n<\/div>\n<h3 id=\"regional-scope-for-session-tokens\" class=\"code-line\" dir=\"auto\" data-line=\"176\">Regional Scope for Session Tokens<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"177\"><strong>Date:<\/strong>\u00a0May 19, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38003\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38003\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38003\">#38003<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"180\">Introduces regionally scoped session tokens to better manage and reduce potential cross-regional replication delays. By maintaining session tokens at a regional level, the SDK can minimize retries and enhance performance, especially in globally distributed applications.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"182\"><strong>Example Configuration:<\/strong><\/p>\n<pre><code class=\"code-line language-java\" dir=\"auto\" data-line=\"183\">System.setProperty(<span class=\"hljs-string\">\"COSMOS.SESSION_CAPTURING_TYPE\"<\/span>, <span class=\"hljs-string\">\"REGION_SCOPED\"<\/span>);\r\n<\/code><\/pre>\n<h3 id=\"query-statement-in-diagnostics-and-tracing\" class=\"code-line\" dir=\"auto\" data-line=\"187\">Query Statement in Diagnostics and Tracing<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"188\"><strong>Date:<\/strong>\u00a0May 24, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39990\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39990\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39990\">#39990<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"191\">Enhances diagnostics with a new option to conditionally print query statements in the\u00a0<code>db.statement<\/code>\u00a0attribute. Users can choose between\u00a0<code>NONE<\/code>,\u00a0<code>PARAMETERIZED_ONLY<\/code>, and\u00a0<code>ALL<\/code>, offering flexibility in managing sensitive information while still benefiting from detailed diagnostics.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"193\"><strong>Code Snippet:<\/strong><\/p>\n<pre><code class=\"code-line language-java\" dir=\"auto\" data-line=\"194\"><span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">CosmosClientTelemetryConfig<\/span>().showQueryOptions(CosmosClientTelemetryConfig.ShowQueryOptions.ALL);\r\n<\/code><\/pre>\n<h2 id=\"spring-connector-updates\" class=\"code-line\" dir=\"auto\" data-line=\"198\">Spring Connector Updates<\/h2>\n<h3 id=\"indexquerymetrics-in-configuration\" class=\"code-line\" dir=\"auto\" data-line=\"200\">IndexQueryMetrics in Configuration<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"201\"><strong>Date:<\/strong>\u00a0May 7, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39433\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39433\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39433\">#39433<\/a>,\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39623\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39623\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39623\">#39623<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"204\">Exposes\u00a0<code>indexQueryMetrics<\/code>\u00a0to the\u00a0<code>CosmosConfig<\/code>\u00a0via the\u00a0<code>application.properties<\/code>\u00a0configuration file. This feature allows developers to gain insights into query performance, helping them optimize and troubleshoot queries more effectively.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"206\"><strong>Example Configuration:<\/strong><\/p>\n<pre><code class=\"code-line language-properties\" dir=\"auto\" data-line=\"207\"><span class=\"hljs-attr\">azure.cosmos.index-query-metrics-enabled<\/span>=<span class=\"hljs-string\">true<\/span>\r\n<\/code><\/pre>\n<h3 id=\"support-for-transient-annotation\" class=\"code-line\" dir=\"auto\" data-line=\"211\">Support for Transient Annotation<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"212\"><strong>Date:<\/strong>\u00a0June 3, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39760\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39760\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39760\">#39760<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"215\">Fields annotated with\u00a0<code>@Transient<\/code>\u00a0will not be persisted to the database during operations like\u00a0<code>save()<\/code>,\u00a0<code>saveAll()<\/code>, and\u00a0<code>upsert()<\/code>. However, they will continue to be serialized in the returned entity objects. This feature is useful for excluding non-persistent fields from database operations while still keeping them in the application logic.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"217\"><strong>Example Usage:<\/strong><\/p>\n<pre><code class=\"code-line language-java\" dir=\"auto\" data-line=\"218\"><span class=\"hljs-meta\">@Entity<\/span>\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title class_\">MyEntity<\/span> {\r\n    <span class=\"hljs-meta\">@Id<\/span>\r\n    <span class=\"hljs-keyword\">private<\/span> String id;\r\n\r\n    <span class=\"hljs-keyword\">private<\/span> String name;\r\n\r\n    <span class=\"hljs-meta\">@Transient<\/span>\r\n    <span class=\"hljs-keyword\">private<\/span> String nonPersistentField;\r\n\r\n    <span class=\"hljs-comment\">\/\/ getters and setters<\/span>\r\n}\r\n<\/code><\/pre>\n<h3 id=\"hierarchical-partition-key-support\" class=\"code-line\" dir=\"auto\" data-line=\"233\">Hierarchical Partition Key Support<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"234\"><strong>Date:<\/strong>\u00a0June 30, 2024\u00a0<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38365\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38365\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38365\">#38365<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"237\">Introduces <a href=\"https:\/\/aka.ms\/cosmos-hierarchical-partitioning\" target=\"_blank\" rel=\"noopener\">hierarchical partition key<\/a> support in the <a href=\"https:\/\/aka.ms\/SpringDataCosmos\" target=\"_blank\" rel=\"noopener\">Spring Data Cosmos<\/a> module, allowing more granular control over data partitioning. This is particularly beneficial for applications with complex data models that require multi-level partitioning.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"239\"><strong>Example Usage:<\/strong><\/p>\n<pre><code class=\"code-line language-java\" dir=\"auto\" data-line=\"240\"><span class=\"hljs-type\">PartitionKey<\/span> <span class=\"hljs-variable\">pk<\/span> <span class=\"hljs-operator\">=<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-title class_\">PartitionKeyBuilder<\/span>()\r\n    .add(entity.getId())\r\n    .add(entity.getFirstName())\r\n    .add(entity.getLastName())\r\n    .build();\r\n\r\nOptional&lt;HierarchicalPartitionKeyEntity&gt; result = repository.findById(entity.getId(), pk);\r\n<\/code><\/pre>\n<h2 id=\"spark-connector-updates\" class=\"code-line\" dir=\"auto\" data-line=\"250\">Spark Connector Updates<\/h2>\n<h3 id=\"configurable-connection-pool-size\" class=\"code-line\" dir=\"auto\" data-line=\"252\">Configurable Connection Pool Size<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"253\"><strong>Date:<\/strong>\u00a0January 14, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38305\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38305\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38305\">#38305<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"256\">Adds the option\u00a0<code>spark.cosmos.http.connectionPoolSize<\/code> to override the HTTP connection pool size in Gateway mode, addressing limits for high-concurrency scenarios. This is useful for containers with a high number of partitions, ensuring efficient and scalable network management.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"258\"><strong>Example Configuration:<\/strong><\/p>\n<pre><code class=\"code-line language-scala\" dir=\"auto\" data-line=\"259\"><span class=\"hljs-keyword\">val<\/span> cfg = <span class=\"hljs-type\">Map<\/span>(\r\n    <span class=\"hljs-string\">\"spark.cosmos.accountEndpoint\"<\/span> -&gt; cosmosEndpoint,\r\n    <span class=\"hljs-string\">\"spark.cosmos.accountKey\"<\/span> -&gt; cosmosMasterKey,\r\n    <span class=\"hljs-string\">\"spark.cosmos.http.connectionPoolSize\"<\/span> -&gt; <span class=\"hljs-string\">\"2000\"<\/span>\r\n)\r\n<\/code><\/pre>\n<h3 id=\"optimization-for-readmany-queries\" class=\"code-line\" dir=\"auto\" data-line=\"267\">Optimization for\u00a0<code>readMany<\/code>\u00a0Queries<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"268\"><strong>Date:<\/strong>\u00a0February 8, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38299\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38299\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38299\">#38299<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"271\">Optimizes queries by using the\u00a0<code>readMany<\/code>\u00a0API when applicable, improving performance for joins and large dataset reads. This feature allows Spark to leverage the efficiency of\u00a0<code>readMany<\/code> for retrieving large volumes of data based on dynamic partition pruning, significantly reducing query time and resource utilization. The <a href=\"https:\/\/devblogs.microsoft.com\/cosmosdb\/read-many-items-fast-with-the-java-sdk-for-azure-cosmos-db\" target=\"_blank\" rel=\"noopener\">readMany method in Java SDK<\/a> is now also exposed as an API in the Spark Connector, turbo charging &#8220;read many items fast&#8221; scenarios. For a complete Scala demo sample, see <a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/blob\/main\/sdk\/cosmos\/azure-cosmos-spark_3_2-12\/Samples\/Scala\/readManySample.scala\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/blob\/main\/sdk\/cosmos\/azure-cosmos-spark_3_2-12\/Samples\/Scala\/readManySample.scala\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/blob\/main\/sdk\/cosmos\/azure-cosmos-spark_3_2-12\/Samples\/Scala\/readManySample.scala\">here<\/a>. For more information, check out this <a href=\"https:\/\/www.youtube.com\/watch?v=6KeAsnwD5sc\" target=\"_blank\" rel=\"noopener\">YouTube video<\/a> from Cosmos Conf 2024!<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"273\"><strong>Example Usage:<\/strong><\/p>\n<pre><code class=\"code-line language-scala\" dir=\"auto\" data-line=\"274\"><span class=\"hljs-keyword\">import<\/span> com.azure.cosmos.spark.udf.<span class=\"hljs-type\">GetCosmosItemIdentityValue<\/span>\r\n<span class=\"hljs-keyword\">import<\/span> org.apache.spark.sql.functions._\r\n<span class=\"hljs-keyword\">import<\/span> org.apache.spark.sql.types._\r\n\r\n<span class=\"hljs-comment\">\/\/ Configurations<\/span>\r\n<span class=\"hljs-keyword\">val<\/span> cfg = <span class=\"hljs-type\">Map<\/span>(\r\n    <span class=\"hljs-string\">\"spark.cosmos.accountEndpoint\"<\/span> -&gt; cosmosEndpoint,\r\n    <span class=\"hljs-string\">\"spark.cosmos.accountKey\"<\/span> -&gt; cosmosMasterKey,\r\n    <span class=\"hljs-string\">\"spark.cosmos.database\"<\/span> -&gt; <span class=\"hljs-string\">\"myDatabase\"<\/span>,\r\n    <span class=\"hljs-string\">\"spark.cosmos.container\"<\/span> -&gt; <span class=\"hljs-string\">\"myContainer\"<\/span>,\r\n    <span class=\"hljs-string\">\"spark.cosmos.read.readManyFiltering.enabled\"<\/span> -&gt; <span class=\"hljs-string\">\"true\"<\/span>,\r\n    <span class=\"hljs-string\">\"spark.cosmos.read.runtimeFiltering.enabled\"<\/span> -&gt; <span class=\"hljs-string\">\"true\"<\/span>\r\n)\r\n\r\n<span class=\"hljs-comment\">\/\/ Register UDF for item identity<\/span>\r\nspark.udf.register(<span class=\"hljs-string\">\"GetCosmosItemIdentityValue\"<\/span>, <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-type\">GetCosmosItemIdentityValue<\/span>(), <span class=\"hljs-type\">StringType<\/span>)\r\n\r\n<span class=\"hljs-comment\">\/\/ Construct _itemIdentity for readMany<\/span>\r\n<span class=\"hljs-keyword\">val<\/span> identityDF = inputDf.withColumn(<span class=\"hljs-string\">\"_itemIdentity\"<\/span>, expr(<span class=\"hljs-string\">\"GetCosmosItemIdentityValue(id, array(pk))\"<\/span>))\r\n\r\n<span class=\"hljs-comment\">\/\/ Read many using the DataFrame with _itemIdentity<\/span>\r\n<span class=\"hljs-keyword\">val<\/span> readManyDf = com.azure.cosmos.spark.<span class=\"hljs-type\">CosmosItemsDataSource<\/span>.readMany(identityDF._jdf, cfg.asJava, schema)\r\n<\/code><\/pre>\n<h3 id=\"custom-schema-support-for-nested-properties\" class=\"code-line\" dir=\"auto\" data-line=\"300\">Custom Schema Support for Nested Properties<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"301\"><strong>Date:<\/strong>\u00a0February 8, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38481\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38481\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38481\">#38481<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"304\">Allows flattening a nested\u00a0<code>ObjectNode<\/code>\u00a0into a\u00a0<code>StringType<\/code>\u00a0for custom schemas. This feature simplifies the handling of complex nested JSON structures by allowing developers to store them as raw JSON strings, which can be more efficient and easier to manage in certain use cases.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"306\"><strong>Example Usage:<\/strong><\/p>\n<pre><code class=\"code-line language-scala\" dir=\"auto\" data-line=\"307\"><span class=\"hljs-keyword\">val<\/span> schema = <span class=\"hljs-type\">StructType<\/span>(<span class=\"hljs-type\">Seq<\/span>(\r\n  <span class=\"hljs-type\">StructField<\/span>(<span class=\"hljs-string\">\"nestedField\"<\/span>, <span class=\"hljs-type\">StringType<\/span>), <span class=\"hljs-comment\">\/\/ Flattened nested object<\/span>\r\n  <span class=\"hljs-type\">StructField<\/span>(<span class=\"hljs-string\">\"anotherField\"<\/span>, <span class=\"hljs-type\">StringType<\/span>)\r\n))\r\n\r\n<span class=\"hljs-keyword\">val<\/span> row = defaultRowConverter.fromObjectNodeToRow(schema, objectNode, <span class=\"hljs-type\">SchemaConversionModes<\/span>.<span class=\"hljs-type\">Relaxed<\/span>)\r\n<\/code><\/pre>\n<h3 id=\"reuse-cosmosasyncclient-for-spark-applications\" class=\"code-line\" dir=\"auto\" data-line=\"316\">Reuse CosmosAsyncClient for Spark Applications<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"317\"><strong>Date:<\/strong>\u00a0February 20, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38834\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38834\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/38834\">#38834<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"320\">Provides an API to retrieve the\u00a0<code>CosmosAsyncClient<\/code>\u00a0used internally by the connector, promoting client reuse across Spark applications. This reduces the overhead of creating multiple client instances and helps maintain consistent configuration across different parts of the application.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"322\"><strong>Example Usage:<\/strong><\/p>\n<pre><code class=\"code-line language-scala\" dir=\"auto\" data-line=\"323\"><span class=\"hljs-keyword\">val<\/span> cosmosClient = <span class=\"hljs-type\">CosmosAsyncClientCache<\/span>.getCosmosClientFromCache(cfg.asJava).getClient\r\n<\/code><\/pre>\n<h3 id=\"spark-35-support\" class=\"code-line\" dir=\"auto\" data-line=\"327\">Spark 3.5 Support<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"328\"><strong>Date:<\/strong>\u00a0April 16, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39395\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39395\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39395\">#39395<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"331\">Adds support\u00a0for Spark 3.5, ensuring compatibility with the latest Spark release. This update allows developers to take advantage of the newest features and improvements in Spark, enhancing the performance and capabilities of their data processing pipelines.<\/p>\n<h3 id=\"native-netty-transport\" class=\"code-line\" dir=\"auto\" data-line=\"333\">Native Netty Transport<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"334\"><strong>Date:<\/strong>\u00a0April 27, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39834\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39834\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39834\">#39834<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"337\">Introduces the option to use native Netty transport in Spark, which is more efficient, especially for high-connection scenarios. Native Netty transport improves network performance and resource utilization, making it ideal for applications with heavy network traffic.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"339\"><strong>Example Configuration:<\/strong><\/p>\n<pre><code class=\"code-line language-scala\" dir=\"auto\" data-line=\"340\"><span class=\"hljs-keyword\">val<\/span> cfg = <span class=\"hljs-type\">Map<\/span>(\r\n    <span class=\"hljs-string\">\"spark.cosmos.accountEndpoint\"<\/span> -&gt; cosmosEndpoint,\r\n    <span class=\"hljs-string\">\"spark.cosmos.accountKey\"<\/span> -&gt; cosmosMasterKey,\r\n    <span class=\"hljs-string\">\"spark.cosmos.enforceNativeTransport\"<\/span> -&gt; <span class=\"hljs-string\">\"true\"<\/span>\r\n)\r\n<\/code><\/pre>\n<h3 id=\"managedidentity-authentication-in-databricks\" class=\"code-line\" dir=\"auto\" data-line=\"348\">ManagedIdentity Authentication in Databricks<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"349\"><strong>Date:<\/strong>\u00a0April 27, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39870\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39870\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/39870\">#39870<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"352\">Supports Managed Identity authentication in Databricks, simplifying authentication setup in Azure environments. This feature allows seamless and secure integration with Azure Cosmos DB without the need to manage service principals or client secrets.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"354\"><strong>Example Usage:<\/strong><\/p>\n<pre><code class=\"code-line language-scala\" dir=\"auto\" data-line=\"355\"><span class=\"hljs-keyword\">val<\/span> cfg = <span class=\"hljs-type\">Map<\/span>(\r\n    <span class=\"hljs-string\">\"spark.cosmos.accountEndpoint\"<\/span> -&gt; cosmosEndpoint,\r\n    <span class=\"hljs-string\">\"spark.cosmos.auth.type\"<\/span> -&gt; <span class=\"hljs-string\">\"ManagedIdentity\"<\/span>,\r\n    <span class=\"hljs-string\">\"spark.cosmos.account.subscriptionId\"<\/span> -&gt; subscriptionId,\r\n    <span class=\"hljs-string\">\"spark.cosmos.account.tenantId\"<\/span> -&gt; tenantId,\r\n    <span class=\"hljs-string\">\"spark.cosmos.account.resourceGroupName\"<\/span> -&gt; resourceGroupName,\r\n    <span class=\"hljs-string\">\"spark.cosmos.database\"<\/span> -&gt; cosmosDatabaseName,\r\n    <span class=\"hljs-string\">\"spark.cosmos.container\"<\/span> -&gt; cosmosContainerName\r\n)\r\n<\/code><\/pre>\n<p class=\"code-line\" dir=\"auto\" data-line=\"366\">For a complete notebook sample, see <a title=\"#provide-the-notebook-sample-link-here\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/blob\/main\/sdk\/cosmos\/azure-cosmos-spark_3_2-12\/test-databricks\/notebooks\/basicScenarioAadManagedIdentity.scala\" target=\"_blank\" rel=\"noopener\" data-href=\"#provide-the-notebook-sample-link-here\">here<\/a>.<\/p>\n<h3 id=\"support-for-access-tokens-via-accountdataresolver\" class=\"code-line\" dir=\"auto\" data-line=\"368\">Support for Access Tokens via AccountDataResolver<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"369\"><strong>Date:<\/strong>\u00a0May 20, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/40079\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/40079\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/40079\">#40079<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"372\">Introduces support for using access tokens in Spark environments via\u00a0<code>AccountDataResolver<\/code>, enabling more flexible authentication scenarios. This feature allows custom implementations to provide access tokens, enabling secure and dynamic authentication methods.<\/p>\n<h3 id=\"spn-authentication-with-certificates\" class=\"code-line\" dir=\"auto\" data-line=\"374\">SPN Authentication with Certificates<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"375\"><strong>Date:<\/strong>\u00a0May 24, 2024\n<strong>PR:<\/strong>\u00a0<a title=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/40325\" href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/40325\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/pull\/40325\">#40325<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"378\">Allows using Service Principal Name (SPN) authentication with certificates instead of client secrets, providing a more secure and manageable way to authenticate Spark applications. This feature simplifies security management by allowing the use of certificates, which can be rotated and managed more easily than secrets.<\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"380\"><strong>Example Usage:<\/strong><\/p>\n<pre><code class=\"code-line language-scala\" dir=\"auto\" data-line=\"381\"><span class=\"hljs-keyword\">val<\/span> cfg = <span class=\"hljs-type\">Map<\/span>(\r\n    <span class=\"hljs-string\">\"spark.cosmos.accountEndpoint\"<\/span> -&gt; cosmosEndpoint,\r\n    <span class=\"hljs-string\">\"spark.cosmos.auth.type\"<\/span> -&gt; <span class=\"hljs-string\">\"ServicePrincipal\"<\/span>,\r\n    <span class=\"hljs-string\">\"spark.cosmos.auth.aad.clientId\"<\/span> -&gt; clientId,\r\n    <span class=\"hljs-string\">\"spark.cosmos.auth.aad.clientCertPemBase64\"<\/span> -&gt; clientCert,\r\n    <span class=\"hljs-string\">\"spark.cosmos.account.tenantId\"<\/span> -&gt; tenantId,\r\n    <span class=\"hljs-string\">\"spark.cosmos.database\"<\/span> -&gt; cosmosDatabaseName,\r\n    <span class=\"hljs-string\">\"spark.cosmos.container\"<\/span> -&gt; cosmosContainerName\r\n)\r\n<\/code><\/pre>\n<h2 id=\"kafka-connector-updates\" class=\"code-line\" dir=\"auto\" data-line=\"393\">Kafka Connector Updates<\/h2>\n<h3 id=\"major-v2-release\" class=\"code-line\" dir=\"auto\" data-line=\"395\">Major V2 Release<\/h3>\n<p class=\"code-line\" dir=\"auto\" data-line=\"396\"><strong>Date:<\/strong>\u00a0April 26, 2024\n<strong>Blog:<\/strong>\u00a0<a title=\"https:\/\/devblogs.microsoft.com\/cosmosdb\/enhancements-in-the-kafka-connector-for-azure-cosmos-db-a-new-era-of-scalability-and-flexibility\/\" href=\"https:\/\/devblogs.microsoft.com\/cosmosdb\/enhancements-in-the-kafka-connector-for-azure-cosmos-db-a-new-era-of-scalability-and-flexibility\/\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/devblogs.microsoft.com\/cosmosdb\/enhancements-in-the-kafka-connector-for-azure-cosmos-db-a-new-era-of-scalability-and-flexibility\/\">Enhancements in the Kafka Connector for Azure Cosmos DB<\/a><\/p>\n<p class=\"code-line\" dir=\"auto\" data-line=\"399\">The V2 release of the Kafka Source and Sink connectors introduces significant improvements in scalability, performance, and flexibility. These enhancements are designed to provide better load balancing, improved handling of high-throughput scenarios, and more customizable configuration options. For more details, read the official\u00a0<a title=\"https:\/\/devblogs.microsoft.com\/cosmosdb\/enhancements-in-the-kafka-connector-for-azure-cosmos-db-a-new-era-of-scalability-and-flexibility\/\" href=\"https:\/\/devblogs.microsoft.com\/cosmosdb\/enhancements-in-the-kafka-connector-for-azure-cosmos-db-a-new-era-of-scalability-and-flexibility\/\" target=\"_blank\" rel=\"noopener\" data-href=\"https:\/\/devblogs.microsoft.com\/cosmosdb\/enhancements-in-the-kafka-connector-for-azure-cosmos-db-a-new-era-of-scalability-and-flexibility\/\">blog post<\/a>.<\/p>\n<h4 id=\"key-benefits\" class=\"code-line\" dir=\"auto\" data-line=\"401\">Key Benefits:<\/h4>\n<ul class=\"code-line\" dir=\"auto\" data-line=\"402\">\n<li class=\"code-line\" dir=\"auto\" data-line=\"402\"><strong>Scalability:<\/strong>\u00a0Improved handling of larger datasets and higher message rates, ensuring robust performance under load.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"403\"><strong>Performance:<\/strong>\u00a0Optimized operations to reduce latency and increase throughput.<\/li>\n<li class=\"code-line\" dir=\"auto\" data-line=\"404\"><strong>Flexibility:<\/strong>\u00a0Enhanced configuration options to tailor the connector&#8217;s behavior to specific use cases.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2>Fixes, patches, and enhancements<\/h2>\n<p>In addition to all of the above features, we have of course made a large number of smaller bug fixes, security patches, enhancements, and improvements. You can track all the changes for each client library, along with the\u00a0<strong>minimum version we recommend you use<\/strong>, by viewing the change logs:<\/p>\n<ul>\n<li><strong>Java SDK\u00a0<a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/blob\/main\/sdk\/cosmos\/azure-cosmos\/CHANGELOG.md\" target=\"_blank\" rel=\"noopener\">change log<\/a><\/strong><\/li>\n<li><strong>Spring Data Client Library\u00a0<a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/blob\/main\/sdk\/spring\/azure-spring-data-cosmos\/CHANGELOG.md\" target=\"_blank\" rel=\"noopener\">change log<\/a><\/strong><\/li>\n<li><strong>OLTP Spark Connector\u00a0<a href=\"https:\/\/github.com\/Azure\/azure-sdk-for-java\/blob\/main\/sdk\/cosmos\/azure-cosmos-spark_3-3_2-12\/CHANGELOG.md\" target=\"_blank\" rel=\"noopener\">change log<\/a><\/strong><\/li>\n<li><strong>Kafka Connectors\u00a0<a href=\"https:\/\/github.com\/microsoft\/kafka-connect-cosmosdb\/blob\/dev\/CHANGELOG.md\" target=\"_blank\" rel=\"noopener\">change log<\/a><\/strong><\/li>\n<\/ul>\n<h3>Get Started with Java in Azure Cosmos DB<\/h3>\n<ul>\n<li><a href=\"https:\/\/docs.microsoft.com\/azure\/cosmos-db\/sql\/sql-api-sdk-java-v4\" target=\"_blank\" rel=\"noopener\">Azure Cosmos DB Java SDK v4 technical documentation<\/a><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/azure\/cosmos-db\/nosql\/troubleshoot-java-sdk-v4?tabs=sync\" target=\"_blank\" rel=\"noopener\">Diagnose and troubleshoot Azure Cosmos DB Java SDK v4<\/a><\/li>\n<li><a href=\"https:\/\/docs.microsoft.com\/azure\/cosmos-db\/sql\/sql-api-java-sdk-samples\" target=\"_blank\" rel=\"noopener\">Azure Cosmos DB Java SDK v4 getting started sample application<\/a><\/li>\n<li><a href=\"https:\/\/aka.ms\/CosmosJavaSDKSamples\" target=\"_blank\" rel=\"noopener\">Java V4 SDK comprehensive samples repository<\/a><\/li>\n<li><a href=\"https:\/\/aka.ms\/CosmosSpringDataSamples\" target=\"_blank\" rel=\"noopener\">Azure Cosmos DB Spring Data Client Library Samples<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/AzureCosmosDB\/CosmicWorksJava\" target=\"_blank\" rel=\"noopener\">Cosmic Works Java<\/a><\/li>\n<li class=\"\"><a href=\"https:\/\/docs.microsoft.com\/azure\/cosmos-db\/sql\/sql-api-sdk-java-v4\" target=\"_blank\" rel=\"noopener\">Release notes and additional resources<\/a><\/li>\n<li><a href=\"https:\/\/devblogs.microsoft.com\/cosmosdb\/java-sdk-v4-async-vs-sync\/\" target=\"_blank\" rel=\"noopener\">Exploring the Async API (reactor programming)<\/a><\/li>\n<\/ul>\n<h3><\/h3>\n<h3>About Azure Cosmos DB<i class=\"fabric-icon fabric-icon--Link\" aria-hidden=\"true\"><\/i><\/h3>\n<p><span style=\"font-weight: 400;\">Azure Cosmos DB is a fully managed and serverless distributed database for modern app development, with SLA-backed speed and availability, automatic and instant scalability, and support for open-source PostgreSQL, MongoDB, and Apache Cassandra. <\/span><a href=\"https:\/\/cosmos.azure.com\/try\/\"><span style=\"font-weight: 400;\">Try Azure Cosmos DB for free here.<\/span><\/a><span style=\"font-weight: 400;\"> To stay in the loop on Azure Cosmos DB updates, follow us on <\/span><a href=\"https:\/\/twitter.com\/AzureCosmosDB\"><span style=\"font-weight: 400;\">X<\/span><\/a><span style=\"font-weight: 400;\">, <\/span><a href=\"https:\/\/aka.ms\/AzureCosmosDBYouTube\"><span style=\"font-weight: 400;\">YouTube<\/span><\/a><span style=\"font-weight: 400;\">, and <\/span><a href=\"https:\/\/www.linkedin.com\/company\/azure-cosmos-db\/\"><span style=\"font-weight: 400;\">LinkedIn<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p class=\"\">To easily build your first database, watch our\u00a0<a href=\"https:\/\/youtube.com\/playlist?list=PLmamF3YkHLoLLGUtSoxmUkORcWaTyHlXp\" target=\"_blank\" rel=\"noopener\">Get Started videos<\/a>\u00a0on YouTube and explore ways to\u00a0<a href=\"https:\/\/docs.microsoft.com\/azure\/cosmos-db\/optimize-dev-test\" target=\"_blank\" rel=\"noopener\">dev\/test free.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>We\u2019re always busy adding new features, fixes, patches, and improvements to our\u00a0Java-based client libraries for Azure Cosmos DB for NoSQL. In this regular blog series, we share highlights of recent updates in the last period. January \u2013 June 2024 updates Java SDK Updates Integrate ThroughputControl with ChangeFeedProcessor Added Payload Size Metrics for Gateway Mode Overloads [&hellip;]<\/p>\n","protected":false},"author":9387,"featured_media":5405,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[14,1915,643],"tags":[],"class_list":["post-8360","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-core-sql-api","category-java-ecosystem-updates","category-java-sdk"],"acf":[],"blog_post_summary":"<p>We\u2019re always busy adding new features, fixes, patches, and improvements to our\u00a0Java-based client libraries for Azure Cosmos DB for NoSQL. In this regular blog series, we share highlights of recent updates in the last period. January \u2013 June 2024 updates Java SDK Updates Integrate ThroughputControl with ChangeFeedProcessor Added Payload Size Metrics for Gateway Mode Overloads [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/cosmosdb\/wp-json\/wp\/v2\/posts\/8360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/cosmosdb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/cosmosdb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cosmosdb\/wp-json\/wp\/v2\/users\/9387"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cosmosdb\/wp-json\/wp\/v2\/comments?post=8360"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/cosmosdb\/wp-json\/wp\/v2\/posts\/8360\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cosmosdb\/wp-json\/wp\/v2\/media\/5405"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/cosmosdb\/wp-json\/wp\/v2\/media?parent=8360"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cosmosdb\/wp-json\/wp\/v2\/categories?post=8360"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/cosmosdb\/wp-json\/wp\/v2\/tags?post=8360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}