Краткое руководство. Создание приложения API для таблиц с помощью пакета SDK для Java и Azure Cosmos DB

ПРИМЕНИМО К: Таблица

В этом кратком руководстве показано, как получить доступ к API таблиц Azure Cosmos DB из приложения Java. API таблиц Azure Cosmos DB — это бессхемное хранилище данных, позволяющее приложениям хранить структурированные данные NoSQL в облаке. Поскольку данные хранятся в структуре без схемы, при добавлении в таблицу объекта с новым атрибутом в нее автоматически добавляются новые свойства (столбцы).

Приложения Java могут получить доступ к API таблиц Azure Cosmos DB с помощью клиентской библиотеки azure-data-tables .

Предварительные требования

Пример приложения написан в Spring Boot 2.6.4. Вы можете использовать либо Visual Studio Code, либо IntelliJ IDEA в качестве интегрированной среды разработки.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начать работу.

Пример приложения

Пример приложения для этого учебника можно клонировать или скачать из репозитория https://github.com/Azure-Samples/msdocs-azure-data-tables-sdk-java. В репозитории примеров имеется как начальное, так и готовое приложение.

git clone https://github.com/Azure-Samples/msdocs-azure-data-tables-sdk-java

В примере приложения в качестве примера для демонстрации возможностей API таблиц используются данные о погоде. Объекты, представляющие наблюдения за погодой, хранятся и извлекаются с помощью API для таблиц, включая хранение объектов с дополнительными свойствами для демонстрации бессхемных возможностей API таблиц.

Снимок экрана: готовое приложение с данными, хранящимися в таблице Azure Cosmos DB с помощью API таблиц.

1\. Создание учетной записи Azure Cosmos DB

Сначала необходимо создать учетную запись API таблиц Azure Cosmos DB, которая будет содержать таблицы, используемые в приложении. Это можно сделать с помощью портала Azure, Azure CLI или Azure PowerShell.

Войдите в портал Azure и выполните следующие действия, чтобы создать учетную запись Azure Cosmos DB.

Инструкции Снимок экрана
На портале Azure выполните следующие действия:
  1. В строке поиска в верхней части портал Azure введите Azure Cosmos DB.
  2. В открывшемся под строкой меню в разделе Службы выберите Azure Cosmos DB.
Снимок экрана: использование поля поиска на верхней панели инструментов для поиска учетных записей Azure Cosmos DB в Azure.
На странице Azure Cosmos DB выберите +Создать. Снимок экрана: расположение кнопки
На странице Выберите вариант API параметр выберите вариант Таблица Azure. Снимок экрана, на котором в качестве правильного варианта выбора показан параметр таблицы Azure.
На странице Создание учетной записи Azure Cosmos DB — таблица Azure заполните форму, как описано ниже.
  1. Создайте новую группу ресурсов для учетной записи хранения с именем rg-msdocs-tables-sdk-demo, выбрав ссылку Создать в разделе Группа ресурсов.
  2. Задайте учетной записи хранения имя cosmos-msdocs-tables-sdk-demo-XYZ, где XYZ — это любые три случайных символа, делающие это название уникальным. Имена учетных записей Azure Cosmos DB должны быть длиной от 3 до 44 символов и могут содержать только строчные буквы, цифры и символ дефиса (-).
  3. Выберите регион для вашей учетной записи хранения.
  4. Выберите для производительности вариант Стандартная.
  5. В разделе Режим емкости выберите для этого примера вариант Подготовленная пропускная способность.
  6. В разделе Применение скидки на основе категории "Бесплатный" для этого примера нажмите Применить.
  7. Нажмите кнопку Проверка и создание внизу экрана, а затем выберите "Создать" на экране сводки, чтобы создать учетную запись Azure Cosmos DB. Это может занять несколько минут.
Снимок экрана: заполнение полей на странице создания учетной записи Azure Cosmos DB.

2\. Создание таблицы

Затем необходимо создать таблицу в учетной записи Azure Cosmos DB, чтобы приложение использовало. В отличие от традиционной базы данных, свойства (столбцы) в таблице указывать не требуется — нужно указать только имя таблицы. Свойства (столбцы) будут создаваться при загрузке данных в таблицу автоматически по мере необходимости.

В портал Azure выполните следующие действия, чтобы создать таблицу в учетной записи Azure Cosmos DB.

Инструкции Снимок экрана
На портале Azure перейдите к странице общих сведений об учетной записи Azure Cosmos DB. Вы можете перейти на страницу обзора учетной записи Azure Cosmos DB, введя имя (cosmos-msdocs-tables-sdk-demo-XYZ) учетной записи Azure Cosmos DB в верхней строке поиска и просмотрев заголовок ресурсов. Выберите имя учетной записи Azure Cosmos DB, чтобы перейти на страницу обзора. Снимок экрана: использование поля поиска на верхней панели инструментов для поиска учетной записи Azure Cosmos DB.
На странице обзора выберите +Добавить таблицу. С правой стороны страницы появится диалоговое окно "Новая таблица". Снимок экрана, на котором показано положение кнопки
В диалоговом окне Новая таблица укажите данные, как описано ниже.
  1. В качестве идентификатора таблице введите WeatherData. Это будет именем таблицы.
  2. В разделе Table throughput (autoscale) (Пропускная способность таблицы (автомасштабирование)) для этого примера выберите Вручную.
  3. В разделе предполагаемого количества запросов в секунду оставьте значение по умолчанию (400).
  4. Нажмите кнопку ОК, чтобы создать таблицу.
Снимок экрана: диалоговое окно

3. Получение строки подключения Azure Cosmos DB

Для доступа к таблицам в Azure Cosmos DB приложению потребуется строка подключения к таблице для учетной записи хранения CosmosDB. Строку подключения можно получить с помощью портала Azure, Azure CLI или Azure PowerShell.

Инструкции Снимок экрана
В левой части страницы учетной записи Azure Cosmos DB под заголовком Параметры найдите элемент меню Строка подключения и выберите его. Вы будете перенаправлены на страницу, где можно получить строку подключения для учетной записи хранения. Снимок экрана: расположение ссылки на строки подключения на странице Azure Cosmos DB.
Скопируйте основную строку подключения для своего приложения. Снимок экрана, на котором показана строка подключения для выбора и использования в приложении.

Строка подключения для учетной записи Azure Cosmos DB считается секретом приложения и должна быть защищена как любой другой секрет приложения или пароль. В этом примере для хранения строки подключения во время разработки и предоставления доступа к ней приложению используется POM.

<profiles>
    <profile>
        <id>local</id>
        <properties>
            <azure.tables.connection.string>
                <![CDATA[YOUR-DATA-TABLES-SERVICE-CONNECTION-STRING]]>
            </azure.tables.connection.string>
            <azure.tables.tableName>WeatherData</azure.tables.tableName>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
</profiles>

4 - включение пакета azure-data-tables

Чтобы получить доступ к API таблиц Azure Cosmos DB из приложения Java, добавьте пакет azure-data-tables .

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-data-tables</artifactId>
    <version>12.2.1</version>
</dependency>

5 - настройка клиента Table в TableServiceConfig.java

Пакет SDK Azure взаимодействует с Azure с помощью клиентских объектов, используя их для выполнения различных операций в Azure. Объект TableClient используется для взаимодействия с API таблиц Azure Cosmos DB.

Как правило, приложение создает для каждой таблицы отдельный объект TableClient, который будет использоваться во всем приложении. Рекомендуется указать, что метод создает объект TableClient, управляемый контейнером Spring и в качестве одного из вариантов для этого.

В файле TableServiceConfig.java приложения измените метод tableClientConfiguration() так, чтобы он соответствовал следующему фрагменту кода:

@Configuration
public class TableServiceConfiguration {

    private static String TABLE_NAME;

    private static String CONNECTION_STRING;

    @Value("${azure.tables.connection.string}")
    public void setConnectionStringStatic(String connectionString) {
        TableServiceConfiguration.CONNECTION_STRING = connectionString;
    }

    @Value("${azure.tables.tableName}")
    public void setTableNameStatic(String tableName) {
        TableServiceConfiguration.TABLE_NAME = tableName;
    }

    @Bean
    public TableClient tableClientConfiguration() {
        return new TableClientBuilder()
                .connectionString(CONNECTION_STRING)
                .tableName(TABLE_NAME)
                .buildClient();
    }
    
}

Также добавьте следующую инструкцию using в самое начало файла TableServiceConfig.java.

import com.azure.data.tables.TableClient;
import com.azure.data.tables.TableClientBuilder;

6. Реализация операций с таблицами Azure Cosmos DB

Все операции с таблицами Azure Cosmos DB для примера приложения реализуются в классе, TablesServiceImpl расположенном в каталоге Службы . Вам потребуется импортировать пакет SDK com.azure.data.tables.

import com.azure.data.tables.TableClient;
import com.azure.data.tables.models.ListEntitiesOptions;
import com.azure.data.tables.models.TableEntity;
import com.azure.data.tables.models.TableTransactionAction;
import com.azure.data.tables.models.TableTransactionActionType;

В начале класса TableServiceImpl добавьте конструктор и переменную-член для объекта TableClient, чтобы разрешить внедрение объекта TableClient в класс.

@Autowired
private TableClient tableClient;

Получение строк из таблицы

Класс TableClient содержит метод с именем listEntities, который позволяет выбирать строки из таблицы. В этом примере будут выбраны все строки из таблицы, так как параметры в метод не передаются.

Метод также принимает универсальный параметр типа ITableEntity, который указывает, в каком виде будут возвращены данные класса модели. В этом случае используется встроенный класс TableEntity, а это означает, что метод listEntities возвратит в качестве результатов коллекцию PagedIterable<TableEntity>.

public List<WeatherDataModel> retrieveAllEntities() {
    List<WeatherDataModel> modelList = tableClient.listEntities().stream()
        .map(WeatherDataUtils::mapTableEntityToWeatherDataModel)
        .collect(Collectors.toList());
    return Collections.unmodifiableList(WeatherDataUtils.filledValue(modelList));
}

Класс TableEntity, определенный в пакете com.azure.data.tables.models, имеет свойства для ключа секции и значений ключей строк в таблице. Вместе эти два значения образуют уникальный ключ для строки в таблице. В этом примере приложения имя метеостанции (city) хранится в ключе секции, а дата и время наблюдения хранятся в ключе строки. Все остальные свойства (температура, влажность, скорость ветра) хранятся в словаре объекта TableEntity.

Распространенной практикой является привязка объекта TableEntity к объекту собственного определения. Для этой цели пример приложения определяет класс WeatherDataModel в каталоге Models. Этот класс имеет свойства для имени станции и даты наблюдения, с которыми будет сопоставляться ключ секции и ключ строки, что позволяет использовать более понятные имена свойств для этих значений. Для хранения всех остальных свойств объекта он использует словарь. Это распространенный шаблон при работе с хранилищем таблиц, поскольку строка может иметь любое количество произвольных свойств, а нам нужно, чтобы объекты модели могли записывать их все. Этот класс также содержит методы для перечисления свойств класса.

public class WeatherDataModel {

    public WeatherDataModel(String stationName, String observationDate, OffsetDateTime timestamp, String etag) {
        this.stationName = stationName;
        this.observationDate = observationDate;
        this.timestamp = timestamp;
        this.etag = etag;
    }

    private String stationName;

    private String observationDate;

    private OffsetDateTime timestamp;

    private String etag;

    private Map<String, Object> propertyMap = new HashMap<String, Object>();

    public String getStationName() {
        return stationName;
    }

    public void setStationName(String stationName) {
        this.stationName = stationName;
    }

    public String getObservationDate() {
        return observationDate;
    }

    public void setObservationDate(String observationDate) {
        this.observationDate = observationDate;
    }

    public OffsetDateTime getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(OffsetDateTime timestamp) {
        this.timestamp = timestamp;
    }

    public String getEtag() {
        return etag;
    }

    public void setEtag(String etag) {
        this.etag = etag;
    }

    public Map<String, Object> getPropertyMap() {
        return propertyMap;
    }

    public void setPropertyMap(Map<String, Object> propertyMap) {
        this.propertyMap = propertyMap;
    }
}

Метод mapTableEntityToWeatherDataModel используется для сопоставления объекта TableEntity с объектом WeatherDataModel. Метод mapTableEntityToWeatherDataModel напрямую сопоставляет свойства PartitionKey, RowKey, Timestamp и Etag, а затем использует свойство properties.keySet для выполнения итерации по другим свойствам в объекте TableEntity и сопоставления их с объектом WeatherDataModel, за исключением свойств, уже сопоставленных напрямую.

Измените код в методе mapTableEntityToWeatherDataModel, чтобы он соответствовал следующему блоку кода.

public static WeatherDataModel mapTableEntityToWeatherDataModel(TableEntity entity) {
    WeatherDataModel observation = new WeatherDataModel(
        entity.getPartitionKey(), entity.getRowKey(),
        entity.getTimestamp(), entity.getETag());
    rearrangeEntityProperties(observation.getPropertyMap(), entity.getProperties());
    return observation;
}

private static void rearrangeEntityProperties(Map<String, Object> target, Map<String, Object> source) {
    Constants.DEFAULT_LIST_OF_KEYS.forEach(key -> {
        if (source.containsKey(key)) {
            target.put(key, source.get(key));
        }
    });
    source.keySet().forEach(key -> {
        if (Constants.DEFAULT_LIST_OF_KEYS.parallelStream().noneMatch(defaultKey -> defaultKey.equals(key))
        && Constants.EXCLUDE_TABLE_ENTITY_KEYS.parallelStream().noneMatch(defaultKey -> defaultKey.equals(key))) {
            target.put(key, source.get(key));
        }
    });
}

Фильтрация строк, возвращенных из таблицы

Для фильтрации строк, возвращаемых из таблицы, можно передать строку фильтра стиля OData в метод listEntities. Например, если требуется получить все показатели погоды в Чикаго с полуночи 1 июля до полуночи 2 июля 2021 года (включительно), передается следующая строка фильтра.

PartitionKey eq 'Chicago' and RowKey ge '2021-07-01 12:00 AM' and RowKey le '2021-07-02 12:00 AM'

Все операторы фильтра OData можно просмотреть на веб-сайте OData в разделе Системный параметр запроса фильтрации.

В примере приложения объект FilterResultsInputModel предназначен для записи любых критериев фильтрации, предоставленных пользователем.

public class FilterResultsInputModel implements Serializable {

    private String partitionKey;

    private String rowKeyDateStart;

    private String rowKeyTimeStart;

    private String rowKeyDateEnd;

    private String rowKeyTimeEnd;

    private Double minTemperature;

    private Double maxTemperature;

    private Double minPrecipitation;

    private Double maxPrecipitation;

    public String getPartitionKey() {
        return partitionKey;
    }

    public void setPartitionKey(String partitionKey) {
        this.partitionKey = partitionKey;
    }

    public String getRowKeyDateStart() {
        return rowKeyDateStart;
    }

    public void setRowKeyDateStart(String rowKeyDateStart) {
        this.rowKeyDateStart = rowKeyDateStart;
    }

    public String getRowKeyTimeStart() {
        return rowKeyTimeStart;
    }

    public void setRowKeyTimeStart(String rowKeyTimeStart) {
        this.rowKeyTimeStart = rowKeyTimeStart;
    }

    public String getRowKeyDateEnd() {
        return rowKeyDateEnd;
    }

    public void setRowKeyDateEnd(String rowKeyDateEnd) {
        this.rowKeyDateEnd = rowKeyDateEnd;
    }

    public String getRowKeyTimeEnd() {
        return rowKeyTimeEnd;
    }

    public void setRowKeyTimeEnd(String rowKeyTimeEnd) {
        this.rowKeyTimeEnd = rowKeyTimeEnd;
    }

    public Double getMinTemperature() {
        return minTemperature;
    }

    public void setMinTemperature(Double minTemperature) {
        this.minTemperature = minTemperature;
    }

    public Double getMaxTemperature() {
        return maxTemperature;
    }

    public void setMaxTemperature(Double maxTemperature) {
        this.maxTemperature = maxTemperature;
    }

    public Double getMinPrecipitation() {
        return minPrecipitation;
    }

    public void setMinPrecipitation(Double minPrecipitation) {
        this.minPrecipitation = minPrecipitation;
    }

    public Double getMaxPrecipitation() {
        return maxPrecipitation;
    }

    public void setMaxPrecipitation(Double maxPrecipitation) {
        this.maxPrecipitation = maxPrecipitation;
    }
}

Когда этот объект передается в метод retrieveEntitiesByFilter в классе TableServiceImpl, он создает строку фильтра для каждого значения свойства, отличного от NULL. Затем он создает объединенную строку фильтра, объединяя все значения вместе с помощью предложения and. Эта объединенная строка фильтра передается в метод listEntities объекта TableClient, в результате чего возвращаются только строки, соответствующие строке фильтра. Аналогичный метод можно использовать в коде для создания подходящих строк фильтра в соответствии с требованиями приложения.

public List<WeatherDataModel> retrieveEntitiesByFilter(FilterResultsInputModel model) {

    List<String> filters = new ArrayList<>();

    if (!StringUtils.isEmptyOrWhitespace(model.getPartitionKey())) {
        filters.add(String.format("PartitionKey eq '%s'", model.getPartitionKey()));
    }
    if (!StringUtils.isEmptyOrWhitespace(model.getRowKeyDateStart())
            && !StringUtils.isEmptyOrWhitespace(model.getRowKeyTimeStart())) {
        filters.add(String.format("RowKey ge '%s %s'", model.getRowKeyDateStart(), model.getRowKeyTimeStart()));
    }
    if (!StringUtils.isEmptyOrWhitespace(model.getRowKeyDateEnd())
            && !StringUtils.isEmptyOrWhitespace(model.getRowKeyTimeEnd())) {
        filters.add(String.format("RowKey le '%s %s'", model.getRowKeyDateEnd(), model.getRowKeyTimeEnd()));
    }
    if (model.getMinTemperature() != null) {
        filters.add(String.format("Temperature ge %f", model.getMinTemperature()));
    }
    if (model.getMaxTemperature() != null) {
        filters.add(String.format("Temperature le %f", model.getMaxTemperature()));
    }
    if (model.getMinPrecipitation() != null) {
        filters.add(String.format("Precipitation ge %f", model.getMinPrecipitation()));
    }
    if (model.getMaxPrecipitation() != null) {
        filters.add(String.format("Precipitation le %f", model.getMaxPrecipitation()));
    }

    List<WeatherDataModel> modelList = tableClient.listEntities(new ListEntitiesOptions()
        .setFilter(String.join(" and ", filters)), null, null).stream()
        .map(WeatherDataUtils::mapTableEntityToWeatherDataModel)
        .collect(Collectors.toList());
    return Collections.unmodifiableList(WeatherDataUtils.filledValue(modelList));
}

Вставка данных с помощью объекта TableEntity

Самый простой способ добавить данные в таблицу — использовать объект TableEntity. В этом примере данные сопоставляются из объекта входной модели с объектом TableEntity. Свойства входного объекта, представляющие имя, а также дату и время для метеостанции, сопоставляются со свойствами PartitionKey и RowKey, которые вместе образуют уникальный ключ для строки в таблице. Затем дополнительные свойства объекта входной модели сопоставляются со свойствами словаря в объекте TableClient. Наконец, для вставки данных в таблицу используется метод createEntity объекта TableClient.

Измените класс insertEntity в примере приложения, чтобы он содержал следующий код.

public void insertEntity(WeatherInputModel model) {
    tableClient.createEntity(WeatherDataUtils.createTableEntity(model));
}

Выполнение операции upsert с данными с помощью объекта TableEntity

При попытке вставить в таблицу строку, сочетание ключа секции и ключа строки которой уже существует в этой таблице, будет выдано сообщение об ошибке. По этой причине при добавлении строк в таблицу вместо метода insertEntity зачастую предпочтительнее использовать upsertEntity. Если в таблице уже существует заданное сочетание ключа секции и ключа строки, метод upsertEntity обновит существующую строку. В противном случае в таблицу будет добавлена строка.

public void upsertEntity(WeatherInputModel model) {
    tableClient.upsertEntity(WeatherDataUtils.createTableEntity(model));
}

Выполнение операции вставки или upsert с данными с помощью свойств переменной

Одним из преимуществ использования API таблиц Azure Cosmos DB является то, что если объект, загружаемый в таблицу, содержит новые свойства, эти свойства автоматически добавляются в таблицу и значения, хранящиеся в Azure Cosmos DB. Нет необходимости выполнять операторы DDL, например ALTER TABLE, для добавления столбцов, как в традиционной базе данных.

Эта модель обеспечивает гибкость работы приложения с источниками данных, которые могут добавлять или изменять то, какие данные должны быть записаны со временем или в каких случаях различные входные данные предоставляют разные сведения приложению. В примере приложения можно смоделировать метеостанцию, которая отправляет не только базовые данные о погоде, но и ряд дополнительных значений. Когда объект с этими новыми свойствами сохраняется в таблице в первый раз, соответствующие свойства (столбцы) автоматически добавляются в таблицу.

В примере приложения класс ExpandableWeatherObject строится вокруг внутреннего словаря, что обеспечивает поддержку любого набора свойств объекта. Этот класс представляет собой типичный шаблон для случая, когда объект должен содержать произвольный набор свойств.

public class ExpandableWeatherObject {

    private String stationName;

    private String observationDate;

    private Map<String, Object> propertyMap = new HashMap<String, Object>();

    public String getStationName() {
        return stationName;
    }

    public void setStationName(String stationName) {
        this.stationName = stationName;
    }

    public String getObservationDate() {
        return observationDate;
    }

    public void setObservationDate(String observationDate) {
        this.observationDate = observationDate;
    }

    public Map<String, Object> getPropertyMap() {
        return propertyMap;
    }

    public void setPropertyMap(Map<String, Object> propertyMap) {
        this.propertyMap = propertyMap;
    }

    public boolean containsProperty(String key) {
        return this.propertyMap.containsKey(key);
    }

    public Object getPropertyValue(String key) {
        return containsProperty(key) ? this.propertyMap.get(key) : null;
    }

    public void putProperty(String key, Object value) {
        this.propertyMap.put(key, value);
    }

    public List<String> getPropertyKeys() {
        List<String> list = Collections.synchronizedList(new ArrayList<String>());
        Iterator<String> iterators = this.propertyMap.keySet().iterator();
        while (iterators.hasNext()) {
            list.add(iterators.next());
        }
        return Collections.unmodifiableList(list);
    }

    public Integer getPropertyCount() {
        return this.propertyMap.size();
    }
}

Чтобы вставить или вставить такой объект с помощью API для таблицы, сопоставьте свойства расширяемого объекта с объектом TableEntity и при необходимости используйте методы createEntity или upsertEntity в объекте TableClient .

public void insertExpandableEntity(ExpandableWeatherObject model) {
    tableClient.createEntity(WeatherDataUtils.createTableEntity(model));
}

public void upsertExpandableEntity(ExpandableWeatherObject model) {
    tableClient.upsertEntity(WeatherDataUtils.createTableEntity(model));
}

Обновление сущности

Сущности можно обновить, вызвав метод updateEntity объекта TableClient. Поскольку сущность (строка), сохраненная с помощью API таблиц, может содержать произвольный набор свойств, часто полезно создать объект обновления на основе объекта словаря, аналогичный рассмотренному ранее объекту ExpandableWeatherObject. В этом случае единственным отличием является добавление свойства etag, которое используется для управления параллелизмом во время обновлений.

public class UpdateWeatherObject {

    private String stationName;

    private String observationDate;

    private String etag;

    private Map<String, Object> propertyMap = new HashMap<String, Object>();

    public String getStationName() {
        return stationName;
    }

    public void setStationName(String stationName) {
        this.stationName = stationName;
    }

    public String getObservationDate() {
        return observationDate;
    }

    public void setObservationDate(String observationDate) {
        this.observationDate = observationDate;
    }

    public String getEtag() {
        return etag;
    }

    public void setEtag(String etag) {
        this.etag = etag;
    }

    public Map<String, Object> getPropertyMap() {
        return propertyMap;
    }

    public void setPropertyMap(Map<String, Object> propertyMap) {
        this.propertyMap = propertyMap;
    }
}

В примере приложения этот объект передается в метод updateEntity класса TableServiceImpl. Этот метод сначала загружает существующую сущность из API таблиц с помощью метода getEntity, применяемого к TableClient. Затем он обновляет объект сущности и использует метод updateEntity, чтобы сохранить обновления в базе данных. Обратите внимание, что метод updateEntity принимает текущее значение ETag объекта, и убедитесь, что объект не изменился с момента первоначальной загрузки. Если сущность все же требуется обновить, можно передать значение etag в метод updateEntity.

public void updateEntity(UpdateWeatherObject model) {
    TableEntity tableEntity = tableClient.getEntity(model.getStationName(), model.getObservationDate());
    Map<String, Object> propertiesMap = model.getPropertyMap();
    propertiesMap.keySet().forEach(key -> tableEntity.getProperties().put(key, propertiesMap.get(key)));
    tableClient.updateEntity(tableEntity);
}

Удаление сущности

Чтобы удалить сущность из таблицы, вызовите метод deleteEntity объекта TableClient с ключом секции и ключом строки объекта.

public void deleteEntity(WeatherInputModel model) {
    tableClient.deleteEntity(model.getStationName(),
            WeatherDataUtils.formatRowKey(model.getObservationDate(), model.getObservationTime()));
}

7\. Выполнение кода

Запустите пример приложения для взаимодействия с API таблиц Azure Cosmos DB. При первом запуске приложения данные не отображаются, так как таблица пуста. Используйте любую из кнопок в верхней части приложения, чтобы добавить данные в таблицу.

Снимок экрана приложения с расположением кнопок, используемых для вставки данных в Azure Cosmos DB с помощью API таблиц.

При нажатии кнопки Вставить с помощью сущности таблицы открывается диалоговое окно, в котором можно выполнить операцию вставки или upsert для новой строки с помощью объекта TableEntity.

Снимок экрана приложения, на котором отображается диалоговое окно, используемое для вставки данных с помощью объекта TableEntity.

При нажатии кнопки Вставить с помощью расширяемых данных откроется диалоговое окно, позволяющее вставить объект с пользовательскими свойствами, демонстрируя, как API таблиц Azure Cosmos DB автоматически добавляет свойства (столбцы) в таблицу при необходимости. Чтобы добавить одно или несколько новых свойств и продемонстрировать эту возможность, воспользуйтесь кнопкой Добавить настраиваемое поле.

Снимок экрана приложения, на котором отображается диалоговое окно, используемое для вставки данных с помощью объекта с настраиваемыми полями.

Используйте кнопку Вставить пример данных , чтобы загрузить некоторые примеры данных в таблицу Azure Cosmos DB.

Снимок экрана приложения, на котором показано расположение кнопки

В верхнем меню выберите пункт Фильтрация результатов для отображения страницы "Фильтрация результатов". На этой странице заполните критерии фильтра, чтобы продемонстрировать, как можно создать предложение фильтра и передать его в API таблиц Azure Cosmos DB.

Снимок экрана приложения, на котором показана страница

Очистка ресурсов

Завершив работу с примером приложения, необходимо удалить все ресурсы Azure, связанные с этой статьей, из учетной записи Azure. Это можно сделать, удалив группу ресурсов.

Группу ресурсов можно удалить на портале Azure, выполнив следующие действия.

Инструкции Снимок экрана
Чтобы перейти в группу ресурсов, в строке поиска введите ее имя. На вкладке Группы ресурсов выберите имя нужной группы. Снимок экрана, на котором показано, как найти группу ресурсов.
Выберите Удалить группу ресурсов на панели инструментов в верхней части страницы группы ресурсов. Снимок экрана, на котором показано расположение кнопки
В правой части экрана появится диалоговое окно с запросом подтвердить удаление группы ресурсов.
  1. В текстовом поле введите полное имя группы ресурсов, чтобы подтвердить удаление.
  2. Нажмите кнопку Удалить в нижней части страницы.
Снимок экрана, на котором показано диалоговое окно подтверждения удаления группы ресурсов.

Дальнейшие действия

Из этого краткого руководства вы узнали, как создать учетную запись Azure Cosmos DB и таблицу с помощью обозревателя данных, а также как запустить приложение. Теперь вы можете запрашивать данные с помощью API для таблицы.