Mulai cepat: Membuat API untuk aplikasi Table dengan Java SDK dan Azure Cosmos DB
BERLAKU UNTUK: Meja
Mulai cepat ini menunjukkan cara mengakses Azure Cosmos DB Tables API dari aplikasi Java. Azure Cosmos DB Tables API adalah penyimpanan data tanpa skema yang memungkinkan aplikasi untuk menyimpan data NoSQL terstruktur di cloud. Karena data disimpan dalam desain tanpa skema, properti baru (kolom) secara otomatis ditambahkan ke tabel ketika objek dengan atribut baru ditambahkan ke tabel.
Aplikasi Java dapat mengakses Azure Cosmos DB Tables API menggunakan pustaka klien azure-data-tables .
Prasyarat
Aplikasi contoh ditulis di Spring Boot 2.6.4. Anda dapat menggunakan Visual Studio Code atau IntelliJ IDEA sebagai IDE.
Jika Anda tidak memiliki langganan Azure, buatlah akun gratis sebelum Anda memulai.
Aplikasi sampel
Aplikasi sampel untuk tutorial ini dapat diklon atau diunduh dari https://github.com/Azure-Samples/msdocs-azure-data-tables-sdk-java repositori. Baik starter dan aplikasi yang sudah selesai disertakan dalam repositori sampel.
git clone https://github.com/Azure-Samples/msdocs-azure-data-tables-sdk-java
Aplikasi contoh menggunakan data cuaca sebagai contoh untuk menunjukkan kemampuan Tables API. Objek yang mewakili pengamatan cuaca disimpan dan diambil menggunakan API untuk Tabel, termasuk menyimpan objek dengan properti tambahan untuk menunjukkan kemampuan tanpa skema Dari Tables API.
1 - Membuat akun Azure Cosmos DB
Anda harus terlebih dahulu membuat akun AZURE Cosmos DB Tables API yang akan berisi tabel yang digunakan dalam aplikasi Anda. Tindakan ini dapat dilakukan menggunakan portal Microsoft Azure, Azure CLI, atau Azure PowerShell.
Masuk ke portal Azure dan ikuti langkah-langkah ini untuk membuat akun Azure Cosmos DB.
2 - Membuat tabel
Selanjutnya, Anda perlu membuat tabel dalam akun Azure Cosmos DB untuk digunakan aplikasi Anda. Tidak seperti database tradisional, Anda hanya perlu menentukan nama tabel, bukan properti (kolom) dalam tabel. Saat data dimuat ke dalam tabel Anda, properti (kolom) akan dibuat secara otomatis sesuai kebutuhan.
Di portal Azure, selesaikan langkah-langkah berikut untuk membuat tabel di dalam akun Azure Cosmos DB Anda.
3 - Dapatkan string koneksi Azure Cosmos DB
Untuk mengakses tabel Anda di Azure Cosmos DB, aplikasi Anda akan memerlukan string koneksi tabel untuk akun Penyimpanan CosmosDB. String koneksi dapat diambil menggunakan portal Microsoft Azure, Azure CLI atau Azure PowerShell.
String koneksi untuk akun Azure Cosmos DB Anda dianggap sebagai rahasia aplikasi dan harus dilindungi seperti rahasia atau kata sandi aplikasi lainnya. Contoh ini menggunakan POM untuk menyimpan string koneksi selama pengembangan dan membuatnya tersedia untuk aplikasi.
<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 - Sertakan paket azure-data-tables
Untuk mengakses Azure Cosmos DB Tables API dari aplikasi Java, sertakan paket azure-data-tables .
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-data-tables</artifactId>
<version>12.2.1</version>
</dependency>
5 - 5 - Konfigurasikan klien Tabel dalam TableServiceConfig.java
Azure SDK berkomunikasi dengan Azure menggunakan objek klien untuk menjalankan operasi yang berbeda terhadap Azure. Objek TableClient adalah objek yang digunakan untuk berkomunikasi dengan Azure Cosmos DB Tables API.
Sebuah aplikasi biasanya akan membuat satu objek TableClient per tabel yang akan digunakan di seluruh aplikasi. Sebaiknya tunjukkan bahwa metode menghasilkan biji objek TableClient untuk dikelola oleh kontainer Spring dan sebagai database tunggal untuk mencapainya.
Dalam file TableServiceConfig.java
aplikasi, edit metode tableClientConfiguration()
agar sesuai dengan cuplikan kode berikut:
@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();
}
}
Anda juga perlu menambahkan berikut menggunakan pernyataan di bagian atas file TableServiceConfig.java
.
import com.azure.data.tables.TableClient;
import com.azure.data.tables.TableClientBuilder;
6 - Menerapkan operasi tabel Azure Cosmos DB
Semua operasi tabel Azure Cosmos DB untuk aplikasi sampel diimplementasikan di TablesServiceImpl
kelas yang terletak di direktori Layanan . Anda harus mengimpor paket 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;
Pada awal kelas TableServiceImpl
, tambahkan variabel anggota untuk objek TableClient dan konstruktor untuk memungkinkan objek TableClient dimasukkan ke dalam kelas.
@Autowired
private TableClient tableClient;
Mendapatkan baris dari tabel
Kelas TableClient berisi metode bernama listEntities yang memungkinkan Anda memilih baris dari tabel. Dalam contoh ini, karena tidak ada parameter yang diteruskan ke metode, semua baris akan dipilih dari tabel.
Metode ini juga mengambil parameter generik jenis TableEntity yang menentukan data kelas model yang akan ditampilkan. Dalam hal ini, kelas bawaan TableEntity akan digunakan, yang berarti metode listEntities
akan mengembalikan koleksi PagedIterable<TableEntity>
sebagai hasilnya.
public List<WeatherDataModel> retrieveAllEntities() {
List<WeatherDataModel> modelList = tableClient.listEntities().stream()
.map(WeatherDataUtils::mapTableEntityToWeatherDataModel)
.collect(Collectors.toList());
return Collections.unmodifiableList(WeatherDataUtils.filledValue(modelList));
}
Kelas TableEntity yang didefinisikan dalam paket com.azure.data.tables.models
memiliki properti untuk kunci partisi dan nilai kunci baris dalam tabel. Bersama-sama, kedua nilai ini untuk kunci unik untuk baris dalam tabel. Dalam aplikasi contoh ini, nama stasiun cuaca (kota) disimpan dalam kunci partisi dan tanggal / waktu pengamatan disimpan dalam kunci baris. Semua properti lainnya (suhu, kelembaban, kecepatan angin) disimpan dalam kamus dalam objek TableEntity
.
Ini adalah praktik umum untuk memetakan objek TableEntity ke objek definisi Anda sendiri. Aplikasi contoh mendefinisikan kelas WeatherDataModel
dalam direktori Model untuk tujuan ini. Kelas ini memiliki properti untuk nama stasiun dan tanggal pengamatan yang akan di petakan oleh kunci partisi dan kunci baris, sehingga memberikan nama properti yang lebih bermakna untuk nilai-nilai ini. Kelas tersebut kemudian menggunakan kamus untuk menyimpan semua properti lain pada objek. Ini adalah pola umum ketika bekerja dengan penyimpanan Tabel karena suatu baris dapat memiliki properti arbitrer dalam jumlah berapa pun dan kita ingin objek model dapat menangkap semuanya. Kelas ini juga berisi metode untuk mencantumkan properti di kelas.
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;
}
}
Metode mapTableEntityToWeatherDataModel
digunakan untuk memetakan objek TableEntity ke objek WeatherDataModel
. Metode mapTableEntityToWeatherDataModel
langsung memetakan properti PartitionKey
, RowKey
, Timestamp
, dan Etag
, lalu menggunakan properties.keySet
yang akan diulangi terhadap properti lain dalam objek TableEntity
dan memetakannya ke objek WeatherDataModel
, tanpa properti yang sudah dipetakan secara langsung.
Edit kode dalam metode mapTableEntityToWeatherDataModel
agar sesuai dengan blok kode berikut.
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));
}
});
}
Memfilter baris yang dikembalikan dari tabel
Untuk memfilter baris yang ditampilkan dari tabel, Anda bisa meneruskan string filter gaya OData ke metode listEntities. Misalnya, jika Anda ingin mendapatkan semua pembacaan cuaca untuk Chicago antara 1 Juli 2021 tengah malam dan 2 Juli 2021 tengah malam (inklusif), Anda harus meneruskan string filter berikut.
PartitionKey eq 'Chicago' and RowKey ge '2021-07-01 12:00 AM' and RowKey le '2021-07-02 12:00 AM'
Anda dapat melihat semua operator filter OData di situs web OData di bagian Filter Opsi Kueri Sistem
Dalam aplikasi contoh, objek FilterResultsInputModel
dirancang untuk menangkap semua kriteria filter yang disediakan oleh pengguna.
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;
}
}
Ketika objek ini diteruskan ke metode retrieveEntitiesByFilter
di kelas TableServiceImpl
, tindakan ini akan membuat string filter untuk setiap nilai properti non-null. Kemudian string filter gabungan akan dibuat dengan menggabungkan semua nilai bersama dengan klausul "dan". String filter gabungan ini diteruskan ke metode listEntities di objek TableClient dan hanya baris yang cocok dengan string filter yang akan ditampilkan. Anda dapat menggunakan metode serupa dalam kode Anda untuk membangun string filter yang sesuai seperti yang dipersyaratkan oleh aplikasi Anda.
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));
}
Menyisipkan data menggunakan objek TableEntity
Cara termudah untuk menambahkan data ke tabel adalah dengan menggunakan objek TableEntity. Dalam contoh ini, data dipetakan dari objek model input ke objek TableEntity. Properti pada objek input yang mewakili nama stasiun cuaca dan tanggal/waktu pengamatan masing-masing dipetakan ke properti PartitionKey
dan RowKey
yang bersama-sama membentuk kunci unik untuk baris dalam tabel. Kemudian, properti tambahan pada objek model input dipetakan ke properti kamus pada objek TableClient. Terakhir, metode createEntity pada objek TableClient digunakan untuk memasukkan data ke dalam tabel.
Ubah kelas insertEntity
dalam aplikasi contoh agar mencakup kode berikut.
public void insertEntity(WeatherInputModel model) {
tableClient.createEntity(WeatherDataUtils.createTableEntity(model));
}
Melakukan upsert data menggunakan objek TableEntity
Jika Anda mencoba menyisipkan baris ke dalam tabel dengan kombinasi kunci partisi/kunci baris yang sudah ada dalam tabel tersebut, Anda akan menerima kesalahan. Untuk alasan ini, sebaiknya gunakan UpsertEntity daripada metode insertEntity
saat menambahkan baris ke tabel. Jika kombinasi kunci partisi/kunci baris yang diberikan sudah ada dalam tabel, metode upsertEntity akan memperbarui baris yang ada. Jika tidak, baris akan ditambahkan ke tabel.
public void upsertEntity(WeatherInputModel model) {
tableClient.upsertEntity(WeatherDataUtils.createTableEntity(model));
}
Menyisipkan atau melakukan upsert data dengan properti variabel
Salah satu keuntungan menggunakan Azure Cosmos DB Tables API adalah bahwa jika objek yang dimuat ke tabel berisi properti baru, properti tersebut secara otomatis ditambahkan ke tabel dan nilai yang disimpan di Azure Cosmos DB. Tidak perlu menjalankan pernyataan DDL seperti ALTER TABLE
untuk menambahkan kolom seperti dalam database tradisional.
Model ini memberikan fleksibilitas pada aplikasi Anda ketika berhadapan dengan sumber data yang dapat menambah atau memodifikasi data apa yang perlu ditangkap dari waktu ke waktu atau ketika input yang berbeda memberikan data yang berbeda untuk aplikasi Anda. Dalam aplikasi contoh, kita dapat mensimulasikan stasiun cuaca yang mengirimkan tidak hanya data cuaca dasar tetapi juga sejumlah nilai tambahan. Ketika objek dengan properti baru ini disimpan dalam tabel untuk pertama kalinya, properti (kolom) yang sesuai akan ditambahkan secara otomatis ke tabel.
Dalam aplikasi contoh, kelas ExpandableWeatherObject
dibangun di sekitar kamus internal untuk mendukung setiap set properti pada objek. Kelas ini mewakili pola khas ketika suatu objek perlu berisi satu set properti yang bersifat arbitrer.
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();
}
}
Untuk menyisipkan atau melakukan upsert objek tersebut menggunakan API untuk Tabel, petakan properti objek yang dapat diperluas ke dalam objek TableEntity dan gunakan metode createEntity atau upsertEntity pada objek TableClient yang sesuai.
public void insertExpandableEntity(ExpandableWeatherObject model) {
tableClient.createEntity(WeatherDataUtils.createTableEntity(model));
}
public void upsertExpandableEntity(ExpandableWeatherObject model) {
tableClient.upsertEntity(WeatherDataUtils.createTableEntity(model));
}
Memperbarui entitas
Entitas dapat diperbarui dengan memanggil metode updateEntity pada objek TableClient. Karena entitas (baris) yang disimpan menggunakan Tables API dapat berisi set properti arbitrer, sebaiknya buat objek pembaruan berdasarkan objek Kamus yang mirip dengan ExpandableWeatherObject
yang dibahas sebelumnya. Dalam hal ini, satu-satunya perbedaan adalah penambahan properti etag
yang digunakan untuk kontrol konkurensi selama pembaruan.
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;
}
}
Dalam aplikasi contoh, objek ini diteruskan ke metode updateEntity
di kelas TableServiceImpl
. Metode ini pertama kali memuat entitas yang ada dari Tables API menggunakan metode getEntity pada TableClient. Metode ini kemudian memperbarui objek entitas itu dan menggunakan metode updateEntity
untuk menyimpan pembaruan ke database. Perhatikan bagaimana metode updateEntity mengambil Etag objek saat ini untuk memastikan objek tidak berubah sejak dimuat di awal. Jika Anda ingin tetap memperbarui entitas, Anda dapat meneruskan nilai etag
ke metode 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);
}
Menghapus entitas
Untuk menghapus entitas dari tabel, panggil metode deleteEntity pada objek TableClient dengan kunci partisi dan kunci baris objek.
public void deleteEntity(WeatherInputModel model) {
tableClient.deleteEntity(model.getStationName(),
WeatherDataUtils.formatRowKey(model.getObservationDate(), model.getObservationTime()));
}
7 - Menjalankan kode
Jalankan aplikasi sampel untuk berinteraksi dengan Api Tabel Azure Cosmos DB. Saat pertama kali menjalankan aplikasi, data tidak akan tersedia karena tabel kosong. Gunakan salah satu tombol di bagian atas aplikasi untuk menambahkan data ke tabel.
Memilih tombol Sisipkan menggunakan Entitas Tabel membuka dialog yang memungkinkan Anda menyisipkan atau melakukan upsert pada baris baru menggunakan objek TableEntity
.
Memilih tombol Sisipkan menggunakan Data yang Dapat Diperluas memunculkan dialog yang memungkinkan Anda menyisipkan objek dengan properti kustom, menunjukkan bagaimana Azure Cosmos DB Tables API secara otomatis menambahkan properti (kolom) ke tabel saat diperlukan. Gunakan tombol Tambahkan Bidang Isian Kustom untuk menambahkan satu atau beberapa properti baru dan mendemonstrasikan kemampuan ini.
Gunakan tombol Sisipkan Data Sampel untuk memuat beberapa data sampel ke dalam tabel Azure Cosmos DB Anda.
Pilih item Filter Hasil di menu atas yang akan membawa Anda ke halaman Filter Hasil. Pada halaman ini, isi kriteria filter untuk menunjukkan bagaimana klausa filter dapat dibangun dan diteruskan ke Azure Cosmos DB Tables API.
Membersihkan sumber daya
Setelah selesai dengan aplikasi contoh, Anda harus menghapus semua sumber daya Azure yang terkait dengan artikel ini dari akun Azure Anda. Anda dapat melakukannya dengan menghapus grup sumber daya.
Anda dapat menghapus grup sumber daya di portal Microsoft Azure dengan melakukan hal berikut.
Langkah berikutnya
Dalam mulai cepat ini, Anda telah mempelajari cara membuat akun Microsoft Azure Cosmos DB, membuat tabel menggunakan Data Explorer, dan menjalankan aplikasi. Sekarang Anda dapat mengkueri data Anda menggunakan API untuk Tabel.