Topik ini menjelaskan cara melakukan operasi agregasi untuk menganalisis data. Anda dapat menggunakan operasi agregasi untuk memperoleh nilai minimum, maksimum, jumlah, rata-rata, hitungan, distinct count dari baris, serta statistik persentil. Operasi agregasi juga mendukung pengelompokan hasil berdasarkan nilai bidang, rentang, lokasi geografis, filter, histogram, atau date histogram, serta melakukan kueri bersarang dan menanyakan baris dari hasil agregasi di setiap grup. Beberapa operasi agregasi dapat digunakan untuk kueri kompleks.
Prosedur
Berikut adalah prosedur lengkap untuk melakukan agregasi.

Server memproses data yang memenuhi kondisi kueri dan melakukan agregasi sesuai permintaan. Permintaan yang melibatkan agregasi lebih kompleks dibandingkan dengan permintaan tanpa agregasi.
Informasi latar belakang
Tabel berikut menjelaskan metode agregasi yang tersedia.
Metode | Deskripsi |
Nilai minimum | Metode agregasi yang dapat digunakan untuk mengembalikan nilai minimum dari suatu bidang. Metode ini dapat digunakan dengan cara yang serupa seperti operator MIN dalam SQL. |
Nilai maksimum | Metode agregasi yang dapat digunakan untuk mengembalikan nilai maksimum dari suatu bidang. Metode ini dapat digunakan dengan cara yang serupa seperti operator MAX dalam SQL. |
Dan | Metode agregasi yang dapat digunakan untuk mengembalikan jumlah semua nilai untuk bidang numerik. Metode ini dapat digunakan dengan cara yang serupa seperti operator SUM dalam SQL. |
Nilai rata-rata | Metode agregasi yang dapat digunakan untuk mengembalikan rata-rata semua nilai untuk bidang numerik. Metode ini dapat digunakan dengan cara yang serupa seperti operator AVG dalam SQL. |
Hitungan | Metode agregasi yang dapat digunakan untuk mengembalikan jumlah total nilai untuk suatu bidang atau jumlah total baris dalam indeks pencarian. Metode ini dapat digunakan dengan cara yang serupa seperti operator COUNT dalam SQL. |
Distinct count | Metode agregasi yang dapat digunakan untuk mengembalikan jumlah nilai unik untuk suatu bidang. Metode ini dapat digunakan dengan cara yang serupa seperti operator COUNT(DISTINCT) dalam SQL. |
Statistik persentil | Nilai persentil menunjukkan posisi relatif suatu nilai dalam dataset. Sebagai contoh, ketika Anda mengumpulkan statistik untuk waktu respons setiap permintaan selama pemeliharaan rutin sistem Anda, Anda harus menganalisis distribusi waktu respons menggunakan persentil seperti p25, p50, p90, dan p99. |
Pengelompokan berdasarkan nilai bidang | Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan nilai bidang. Nilai yang sama dikelompokkan bersama. Nilai setiap grup dan jumlah anggota di setiap grup dikembalikan. Catatan Pengelompokan berdasarkan nilai bidang menggunakan komputasi paralel dan bukan perhitungan yang tepat. Mungkin ada sedikit kesalahan. |
Pengelompokan berdasarkan beberapa bidang | Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan beberapa bidang. Anda dapat menggunakan token untuk melakukan paging. |
Pengelompokan bersarang | GroupBy mendukung nesting. Anda dapat melakukan operasi sub-agregasi menggunakan GroupBy. |
Pengelompokan berdasarkan rentang | Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan rentang nilai suatu bidang. Nilai bidang yang berada dalam rentang tertentu dikelompokkan bersama. Jumlah nilai dalam setiap rentang dikembalikan. |
Pengelompokan berdasarkan lokasi geografis | Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan jarak dari lokasi geografis ke titik pusat. Hasil kueri dalam jarak yang berada dalam rentang tertentu dikelompokkan bersama. Jumlah nilai dalam setiap rentang dikembalikan. |
Pengelompokan berdasarkan filter | Metode agregasi yang dapat digunakan untuk menyaring hasil kueri dan mengelompokkannya berdasarkan setiap filter untuk memperoleh jumlah hasil yang cocok. Hasil dikembalikan sesuai urutan filter yang ditentukan. |
Kueri berdasarkan histogram | Metode agregasi dapat digunakan untuk mengelompokkan hasil kueri berdasarkan interval data tertentu. Nilai bidang yang berada dalam rentang yang sama dikelompokkan bersama. Rentang nilai setiap grup dan jumlah nilai dalam setiap grup dikembalikan. |
Kueri berdasarkan date histogram | Metode agregasi yang dapat digunakan untuk mengelompokkan hasil kueri berdasarkan interval tanggal tertentu. Nilai bidang yang berada dalam rentang yang sama dikelompokkan bersama. Rentang nilai setiap grup dan jumlah nilai dalam setiap grup dikembalikan. |
Kueri baris yang diperoleh dari hasil operasi agregasi di setiap grup | Setelah Anda mengelompokkan hasil kueri, Anda dapat menanyakan baris di setiap grup. Metode ini dapat digunakan dengan cara yang serupa seperti ANY_VALUE(bidang) dalam MySQL. |
Beberapa agregasi | Anda dapat melakukan beberapa operasi agregasi. Catatan Jika Anda melakukan beberapa operasi agregasi kompleks secara bersamaan, mungkin diperlukan waktu yang lama. |
Prasyarat
Inisialisasi instance OTSClient. Untuk informasi lebih lanjut, lihat Inisialisasi Klien Tablestore.
Buat tabel data dan tuliskan data ke dalamnya. Untuk informasi lebih lanjut, lihat Buat Tabel Data dan Tulis Data.
Buat indeks pencarian untuk tabel data. Untuk informasi lebih lanjut, lihat Buat Indeks Pencarian.
PentingJenis bidang yang didukung oleh fitur agregasi adalah jenis bidang yang didukung oleh indeks pencarian. Untuk informasi tentang jenis bidang yang didukung oleh indeks pencarian dan pemetaan antara jenis bidang tersebut dengan jenis bidang tabel data, lihat Tipe Data.
Nilai minimum
Metode agregasi ini mengembalikan nilai minimum dari suatu bidang, mirip dengan operator MIN dalam SQL.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, dan Date yang didukung.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
Contoh
/** * Harga setiap produk tercantum dalam tabel produk. Kueri harga minimum produk yang diproduksi di Zhejiang. * Pernyataan SQL: SELECT min(column_price) FROM product where place_of_production="Zhejiang". */ public void min(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.term("place_of_production", "Zhejiang")) .limit(0) //Jika Anda hanya ingin memperoleh hasil agregasi alih-alih data spesifik, Anda dapat mengatur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.min("min_agg_1", "column_price").missing(100)) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. System.out.println(resp.getAggregationResults().getAsMinAggregationResult("min_agg_1").getValue()); } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); TermQuery query = new TermQuery(); query.setTerm(ColumnValue.fromString("Zhejiang")); query.setFieldName("place_of_production"); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.term("place_of_production", "Zhejiang").build(); searchQuery.setQuery(query); searchQuery.setLimit(0); MinAggregation aggregation = new MinAggregation(); aggregation.setAggName("min_agg_1"); aggregation.setFieldName("column_price"); aggregation.setMissing(ColumnValue.fromLong(100)); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // MinAggregation aggregation2 = AggregationBuilders.min("min_agg_1", "column_price").missing(100).build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. System.out.println(resp.getAggregationResults().getAsMinAggregationResult("min_agg_1").getValue()); } }
Nilai maksimum
Metode agregasi ini mengembalikan nilai maksimum dari suatu bidang, mirip dengan operator MAX dalam SQL.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, dan Date yang didukung.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
Contoh
/** * Harga setiap produk tercantum dalam tabel produk. Kueri harga maksimum produk yang diproduksi di Zhejiang. * Pernyataan SQL: SELECT max(column_price) FROM product where place_of_production="Zhejiang". */ public void max(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.term("place_of_production", "Zhejiang")) .limit(0) //Jika Anda hanya ingin memperoleh hasil agregasi alih-alih data spesifik, Anda dapat mengatur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.max("max_agg_1", "column_price").missing(0)) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. System.out.println(resp.getAggregationResults().getAsMaxAggregationResult("max_agg_1").getValue()); } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); TermQuery query = new TermQuery(); query.setTerm(ColumnValue.fromString("Zhejiang")); query.setFieldName("place_of_production"); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.term("place_of_production", "Zhejiang").build(); searchQuery.setQuery(query); searchQuery.setLimit(0); MaxAggregation aggregation = new MaxAggregation(); aggregation.setAggName("max_agg_1"); aggregation.setFieldName("column_price"); aggregation.setMissing(ColumnValue.fromLong(100)); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // MaxAggregation aggregation2 = AggregationBuilders.max("max_agg_1", "column_price").missing(100).build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. System.out.println(resp.getAggregationResults().getAsMaxAggregationResult("max_agg_1").getValue()); } }
Dan
Metode agregasi ini mengembalikan total semua nilai numerik dalam suatu bidang, mirip dengan operator SUM dalam SQL.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long dan Double yang didukung.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
Contoh
/** * Harga setiap produk tercantum dalam tabel produk. Kueri harga maksimum produk yang diproduksi di Zhejiang. * Pernyataan SQL: SELECT sum(column_price) FROM product where place_of_production="Zhejiang". */ public void sum(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.term("place_of_production", "Zhejiang")) .limit(0) //Jika Anda hanya ingin memperoleh hasil agregasi alih-alih data spesifik, Anda dapat mengatur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.sum("sum_agg_1", "column_number").missing(10)) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. System.out.println(resp.getAggregationResults().getAsSumAggregationResult("sum_agg_1").getValue()); } // Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); TermQuery query = new TermQuery(); query.setTerm(ColumnValue.fromString("Zhejiang")); query.setFieldName("place_of_production"); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.term("place_of_production", "Zhejiang").build(); searchQuery.setQuery(query); searchQuery.setLimit(0); SumAggregation aggregation = new SumAggregation(); aggregation.setAggName("sum_agg_1"); aggregation.setFieldName("column_number"); aggregation.setMissing(ColumnValue.fromLong(100)); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // SumAggregation aggregation2 = AggregationBuilders.sum("sum_agg_1", "column_number").missing(10).build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. System.out.println(resp.getAggregationResults().getAsSumAggregationResult("sum_agg_1").getValue()); } }
Nilai rata-rata
Metode agregasi ini mengembalikan rata-rata semua nilai numerik dalam suatu bidang, mirip dengan operator AVG dalam SQL.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, dan Date yang didukung.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
Contoh
/** * Penjualan setiap produk tercantum dalam tabel produk. Kueri harga rata-rata produk yang diproduksi di Zhejiang. * Pernyataan SQL: SELECT avg(column_price) FROM product where place_of_production="Zhejiang". */ public void avg(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.term("place_of_production", "Zhejiang")) .limit(0) //Jika Anda hanya ingin memperoleh hasil agregasi alih-alih data spesifik, Anda dapat mengatur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.avg("avg_agg_1", "column_price")) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. System.out.println(resp.getAggregationResults().getAsAvgAggregationResult("avg_agg_1").getValue()); } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); TermQuery query = new TermQuery(); query.setTerm(ColumnValue.fromString("Zhejiang")); query.setFieldName("place_of_production"); //Dalam komentar berberikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.term("place_of_production", "Zhejiang").build(); searchQuery.setQuery(query); searchQuery.setLimit(0); AvgAggregation aggregation = new AvgAggregation(); aggregation.setAggName("avg_agg_1"); aggregation.setFieldName("column_price"); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // AvgAggregation aggregation2 = AggregationBuilders.avg("avg_agg_1", "column_price").build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. System.out.println(resp.getAggregationResults().getAsAvgAggregationResult("avg_agg_1").getValue()); } }
Hitungan
Metode agregasi ini mengembalikan jumlah total nilai dalam suatu bidang atau jumlah total baris dalam indeks pencarian, mirip dengan operator COUNT dalam SQL.
Anda dapat menggunakan salah satu metode berikut untuk menanyakan jumlah total baris dalam indeks pencarian atau jumlah baris yang memenuhi kondisi kueri:
Gunakan fitur hitungan dari agregasi. Atur parameter count ke * dalam permintaan.
Gunakan fitur kueri untuk memperoleh jumlah baris yang memenuhi kondisi kueri. Atur parameter setGetTotalCount ke true dalam kueri. Gunakan MatchAllQuery untuk memperoleh jumlah total baris dalam indeks pencarian.
Anda dapat menggunakan nama kolom sebagai nilai ekspresi hitungan untuk menanyakan jumlah baris yang berisi kolom dalam indeks pencarian. Metode ini cocok untuk skenario yang melibatkan kolom jarang.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, Boolean, Keyword, Geo_point, dan Date yang didukung.
Contoh
/** * Catatan pelanggaran pedagang dicatat dalam tabel pedagang. Anda dapat menanyakan jumlah pedagang yang berlokasi di Zhejiang dan memiliki catatan pelanggaran. Jika tidak ada catatan pelanggaran untuk seorang pedagang, bidang yang sesuai dengan catatan pelanggaran juga tidak ada untuk pedagang tersebut. * Pernyataan SQL: SELECT count(column_history) FROM product where place_of_production="Zhejiang". */ public void count(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.term("place_of_production", "Zhejiang")) .limit(0) //Jika Anda hanya ingin memperoleh hasil agregasi alih-alih data spesifik, Anda dapat mengatur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.count("count_agg_1", "column_history")) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. System.out.println(resp.getAggregationResults().getAsCountAggregationResult("count_agg_1").getValue()); } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); TermQuery query = new TermQuery(); query.setTerm(ColumnValue.fromString("Zhejiang")); query.setFieldName("place_of_production"); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.term("place_of_production", "Zhejiang").build(); searchQuery.setQuery(query); searchQuery.setLimit(0); CountAggregation aggregation = new CountAggregation(); aggregation.setAggName("count_agg_1"); aggregation.setFieldName("column_history"); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // CountAggregation aggregation2 = AggregationBuilders.count("count_agg_1", "column_history").build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. System.out.println(resp.getAggregationResults().getAsCountAggregationResult("count_agg_1").getValue()); } }
Distinct count
Metode agregasi ini mengembalikan jumlah nilai unik dalam suatu bidang, mirip dengan operator COUNT(DISTINCT) dalam SQL.
Jumlah nilai unik adalah angka perkiraan.
Jika jumlah total baris sebelum menggunakan fitur distinct count kurang dari 10.000, hasil yang dihitung mendekati nilai eksak.
Jika jumlah total baris sebelum menggunakan fitur distinct count lebih besar dari atau sama dengan 100 juta, tingkat kesalahan sekitar 2%.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, Boolean, Keyword, Geo_point, dan Date yang didukung.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
Contoh
/** * Kueri jumlah provinsi unik dari mana produk diproduksi. * Pernyataan SQL: SELECT count(distinct column_place) FROM product. */ public void distinctCount(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) //Jika Anda hanya ingin memperoleh hasil agregasi alih-alih data spesifik, Anda dapat mengatur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.distinctCount("dis_count_agg_1", "column_place")) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. System.out.println(resp.getAggregationResults().getAsDistinctCountAggregationResult("dis_count_agg_1").getValue()); } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); MatchAllQuery query = new MatchAllQuery(); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.matchAll().build(); searchQuery.setQuery(query); searchQuery.setLimit(0); DistinctCountAggregation aggregation = new DistinctCountAggregation(); aggregation.setAggName("dis_count_agg_1"); aggregation.setFieldName("column_place"); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // DistinctCountAggregation aggregation2 = AggregationBuilders.distinctCount("dis_count_agg_1", "column_place").build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. System.out.println(resp.getAggregationResults().getAsDistinctCountAggregationResult("dis_count_agg_1").getValue()); } }
Statistik persentil
Nilai persentil menunjukkan posisi relatif suatu nilai dalam dataset. Sebagai contoh, ketika menganalisis waktu respons selama pemeliharaan sistem, Anda dapat menggunakan persentil seperti p25, p50, p90, dan p99.
Untuk meningkatkan akurasi hasil, disarankan menggunakan nilai persentil ekstrem seperti p1 dan p99. Hasil yang dikembalikan akan lebih akurat dibandingkan dengan nilai lain seperti p50.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, dan Date yang didukung.
percentiles
Persentil seperti p50, p90, dan p99. Anda dapat menentukan satu atau beberapa persentil.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
Contoh
/** * Analisis distribusi waktu respons setiap permintaan yang dikirim ke sistem menggunakan persentil. */ public void percentilesAgg(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("indexName") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) //Jika Anda hanya ingin memperoleh hasil agregasi alih-alih data spesifik, Anda dapat mengatur limit ke 0 untuk meningkatkan kinerja kueri. .addAggregation(AggregationBuilders.percentiles("percentilesAgg", "latency") .percentiles(Arrays.asList(25.0d, 50.0d, 99.0d)) .missing(1.0)) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil. PercentilesAggregationResult percentilesAggregationResult = resp.getAggregationResults().getAsPercentilesAggregationResult("percentilesAgg"); for (PercentilesAggregationItem item : percentilesAggregationResult.getPercentilesAggregationItems()) { System.out.println("key:" + item.getKey() + " value:" + item.getValue().asDouble()); } } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); MatchAllQuery query = new MatchAllQuery(); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.matchAll().build(); searchQuery.setQuery(query); searchQuery.setLimit(0); PercentilesAggregation aggregation = new PercentilesAggregation(); aggregation.setAggName("percentilesAgg"); aggregation.setFieldName("latency"); aggregation.setPercentiles(Arrays.asList(25.0d, 50.0d, 99.0d)); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // AggregationBuilders.percentiles("percentilesAgg", "latency").percentiles(Arrays.asList(25.0d, 50.0d, 99.0d)).missing(1.0).build(); List<Aggregation> aggregationList = new ArrayList<Aggregation>(); aggregationList.add(aggregation); searchQuery.setAggregationList(aggregationList); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil. PercentilesAggregationResult percentilesAggregationResult = resp.getAggregationResults().getAsPercentilesAggregationResult("percentilesAgg"); for (PercentilesAggregationItem item : percentilesAggregationResult.getPercentilesAggregationItems()) { System.out.println("key:" + item.getKey() + " value:" + item.getValue().asDouble()); } } }
Pengelompokan berdasarkan nilai bidang
Metode agregasi ini mengelompokkan hasil kueri berdasarkan nilai bidang. Nilai yang sama dikelompokkan bersama, dan jumlah anggota di setiap grup dikembalikan.
Pengelompokan berdasarkan nilai bidang menggunakan komputasi paralel, sehingga mungkin ada sedikit kesalahan.
Untuk pengelompokan berdasarkan beberapa bidang, gunakan pengelompokan bersarang atau pengelompokan multi-bidang. Untuk informasi lebih lanjut, lihat Lampiran: Metode Berbeda untuk Pengelompokan Multi-Bidang.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long, Double, Boolean, Keyword, dan Date yang didukung.
groupBySorter
Aturan pengurutan untuk grup. Secara default, grup diurutkan berdasarkan jumlah item dalam grup secara menurun. Jika Anda mengonfigurasi beberapa aturan pengurutan, grup diurutkan berdasarkan urutan aturan dikonfigurasi. Aturan pengurutan berikut didukung:
groupKeySortInAsc: Urutkan berdasarkan nilai dalam urutan abjad.
groupKeySortInDesc: Urutkan berdasarkan nilai dalam urutan abjad terbalik.
rowCountSortInAsc: Urutkan berdasarkan jumlah baris secara menaik.
rowCountSortInDesc (default): Urutkan berdasarkan jumlah baris secara menurun.
subAggSortInAsc: Urutkan berdasarkan nilai yang diperoleh dari hasil sub-agregasi secara menaik.
subAggSortInDesc: Urutkan berdasarkan nilai yang diperoleh dari hasil sub-agregasi secara menurun.
size
Jumlah grup yang ingin Anda kembalikan. Nilai default: 10. Nilai maksimum: 2000.
subAggregations
Operasi sub-agregasi yang dapat dilakukan pada data di setiap grup, seperti menghitung nilai maksimum, jumlah, atau rata-rata.
subGroupBys
Operasi sub-pengelompokan yang dapat dilakukan pada data di setiap grup induk untuk lebih mengelompokkan data.
Contoh
Pengelompokan berdasarkan bidang tunggal
/** * Kueri jumlah produk, serta harga maksimum dan minimum produk di setiap kategori. * Contoh hasil yang dikembalikan: Buah: 5. Harga maksimum adalah CNY 15, dan harga minimum adalah CNY 3. Alat mandi: 10. Harga maksimum adalah CNY 98, dan harga minimum adalah CNY 1. Perangkat elektronik: 3. Harga maksimum adalah CNY 8.699, dan harga minimum adalah CNY 2.300. Produk lainnya: 15. Harga maksimum adalah CNY 1.000, dan harga minimum adalah CNY 80. */ public void groupByField(SyncClient client) { //Gunakan builder untuk membuat pernyataan kueri. { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) //Jika Anda hanya ingin memperoleh hasil agregasi alih-alih data spesifik, Anda dapat mengatur limit ke 0 untuk meningkatkan kinerja kueri. .addGroupBy(GroupByBuilders .groupByField("name1", "column_type") .addSubAggregation(AggregationBuilders.min("subName1", "column_price")) .addSubAggregation(AggregationBuilders.max("subName2", "column_price")) ) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. for (GroupByFieldResultItem item : resp.getGroupByResults().getAsGroupByFieldResult("name1").getGroupByFieldResultItems()) { //Tampilkan nilai. System.out.println(item.getKey()); //Tampilkan jumlah baris. System.out.println(item.getRowCount()); //Tampilkan harga minimum. System.out.println(item.getSubAggregationResults().getAsMinAggregationResult("subName1").getValue()); //Tampilkan harga maksimum. System.out.println(item.getSubAggregationResults().getAsMaxAggregationResult("subName2").getValue()); } } //Buat pernyataan kueri tanpa menggunakan builder. { SearchRequest searchRequest = new SearchRequest(); searchRequest.setTableName("<TABLE_NAME>"); searchRequest.setIndexName("<SEARCH_INDEX_NAME>"); SearchQuery searchQuery = new SearchQuery(); MatchAllQuery query = new MatchAllQuery(); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan TermQuery untuk membuat pernyataan kueri. // Query query2 = QueryBuilders.matchAll().build(); searchQuery.setQuery(query); searchQuery.setLimit(0); GroupByField groupByField = new GroupByField(); groupByField.setGroupByName("name1"); groupByField.setFieldName("column_type"); //Konfigurasikan operasi sub-agregasi. MinAggregation minAggregation = AggregationBuilders.min("subName1", "column_price").build(); MaxAggregation maxAggregation = AggregationBuilders.max("subName2", "column_price").build(); groupByField.setSubAggregations(Arrays.asList(minAggregation, maxAggregation)); //Dalam komentar berikut, builder digunakan untuk membuat pernyataan kueri. Metode yang menggunakan builder untuk membuat pernyataan kueri memiliki efek yang sama dengan metode yang menggunakan agregasi untuk membuat pernyataan kueri. // GroupByBuilders.groupByField("name1", "column_type") // .addSubAggregation(AggregationBuilders.min("subName1", "column_price")) // .addSubAggregation(AggregationBuilders.max("subName2", "column_price").build()); List<GroupBy> groupByList = new ArrayList<GroupBy>(); groupByList.add(groupByField); searchQuery.setGroupByList(groupByList); searchRequest.setSearchQuery(searchQuery); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. for (GroupByFieldResultItem item : resp.getGroupByResults().getAsGroupByFieldResult("name1").getGroupByFieldResultItems()) { //Tampilkan nilai. System.out.println(item.getKey()); //Tampilkan jumlah baris. System.out.println(item.getRowCount()); //Tampilkan harga minimum. System.out.println(item.getSubAggregationResults().getAsMinAggregationResult("subName1").getValue()); //Tampilkan harga maksimum. System.out.println(item.getSubAggregationResults().getAsMaxAggregationResult("subName2").getValue()); } } }Pengelompokan berdasarkan beberapa bidang dalam mode bersarang
/** * Contoh pengelompokan hasil kueri berdasarkan beberapa bidang dalam mode bersarang. * Dalam indeks pencarian, Anda dapat menggunakan dua bidang groupBy dalam mode bersarang untuk mencapai efek yang sama seperti menggunakan beberapa bidang groupBy dalam pernyataan SQL. * Pernyataan SQL: select a,d, sum(b),sum(c) from user group by a,d. */ public void GroupByMultiField(SyncClient client) { SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .returnAllColumns(true) //Anda dapat mengatur returnAllColumns ke false dan menentukan nilai untuk addColumesToGet untuk mendapatkan kinerja kueri yang lebih baik. //.addColumnsToGet("col_1","col_2") .searchQuery(SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) //Tentukan kondisi kueri. Kondisi kueri dapat digunakan dengan cara yang sama seperti klausa WHERE dalam SQL. Anda dapat menggunakan QueryBuilders.bool() untuk melakukan kueri bersarang. .addGroupBy( GroupByBuilders .groupByField("unique name_1", "field_a") .size(20) .addSubGroupBy( GroupByBuilders .groupByField("unique name_2", "field_d") .size(20) .addSubAggregation(AggregationBuilders.sum("unique name_3", "field_b")) .addSubAggregation(AggregationBuilders.sum("unique name_4", "field_c")) ) ) .build()) .build(); SearchResponse response = client.search(searchRequest); //Kueri baris yang memenuhi kondisi tertentu. List<Row> rows = response.getRows(); //Peroleh hasil agregasi. GroupByFieldResult groupByFieldResult1 = response.getGroupByResults().getAsGroupByFieldResult("unique name_1"); for (GroupByFieldResultItem resultItem : groupByFieldResult1.getGroupByFieldResultItems()) { System.out.println("field_a key:" + resultItem.getKey() + " Count:" + resultItem.getRowCount()); //Peroleh hasil sub-agregasi. GroupByFieldResult subGroupByResult = resultItem.getSubGroupByResults().getAsGroupByFieldResult("unique name_2"); for (GroupByFieldResultItem item : subGroupByResult.getGroupByFieldResultItems()) { System.out.println("field_a " + resultItem.getKey() + " field_d key:" + item.getKey() + " Count: " + item.getRowCount()); double sumOf_field_b = item.getSubAggregationResults().getAsSumAggregationResult("unique name_3").getValue(); double sumOf_field_c = item.getSubAggregationResults().getAsSumAggregationResult("unique name_4").getValue(); System.out.println("sumOf_field_b:" + sumOf_field_b); System.out.println("sumOf_field_c:" + sumOf_field_c); } } }Urutkan grup untuk agregasi
/** * Contoh konfigurasi aturan pengurutan untuk agregasi. * Metode: Konfigurasikan aturan pengurutan dengan menentukan GroupBySorter. Jika Anda mengonfigurasi beberapa aturan pengurutan, grup diurutkan berdasarkan urutan aturan dikonfigurasi. GroupBySorter mendukung pengurutan secara menaik atau menurun. * Secara default, grup diurutkan berdasarkan jumlah baris secara menurun (GroupBySorter.rowCountSortInDesc()). */ public void groupByFieldWithSort(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) .addGroupBy(GroupByBuilders .groupByField("name1", "column_type") //.addGroupBySorter(GroupBySorter.subAggSortInAsc("subName1")) //Urutkan grup secara menaik berdasarkan nilai yang diperoleh dari hasil sub-agregasi. .addGroupBySorter(GroupBySorter.groupKeySortInAsc()) //Urutkan grup secara menaik berdasarkan nilai yang diperoleh dari hasil agregasi. //.addGroupBySorter(GroupBySorter.rowCountSortInDesc()) //Urutkan grup secara menurun berdasarkan jumlah baris yang diperoleh dari hasil agregasi di setiap grup. .size(20) .addSubAggregation(AggregationBuilders.min("subName1", "column_price")) .addSubAggregation(AggregationBuilders.max("subName2", "column_price")) ) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); }
Pengelompokan bersarang
GroupBy mendukung operasi bersarang, yang memungkinkan Anda menambahkan agregasi tingkat sub berdasarkan hasil pengelompokan tingkat induk.
Untuk memastikan kinerja tinggi operasi GroupBy yang kompleks, batasi jumlah tingkat bersarang. Untuk informasi lebih lanjut, lihat Batas Indeks Pencarian.
Skenario Umum
Pengelompokan Multi-Tingkat (GroupBy + SubGroupBy)
Setelah mengelompokkan data pada tingkat pertama, Anda dapat melakukan pengelompokan tingkat kedua. Contohnya, kelompokkan data berdasarkan provinsi terlebih dahulu, lalu berdasarkan kota untuk memperoleh data setiap kota di setiap provinsi.
Pengelompokan Diikuti oleh Agregasi (GroupBy + SubAggregation)
Setelah mengelompokkan data pada tingkat pertama, Anda dapat melakukan operasi agregasi (seperti menghitung nilai maksimum atau rata-rata) pada data di setiap grup. Contohnya, setelah mengelompokkan data berdasarkan provinsi, Anda dapat memperoleh nilai maksimum metrik tertentu untuk setiap grup provinsi.
Contoh
Contoh berikut menunjukkan cara melakukan pengelompokan bersarang berdasarkan provinsi dan kota, serta menghitung jumlah total pesanan untuk setiap provinsi dan jumlah total pesanan serta jumlah pesanan maksimum untuk setiap kota.
public static void subGroupBy(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .returnAllColumns(true) .searchQuery(SearchQuery.newBuilder() .query(QueryBuilders.matchAll()).limit(20) //Pengelompokan tingkat pertama: Kelompokkan berdasarkan provinsi dan hitung jumlah ID pesanan (total pesanan) untuk setiap provinsi. //Pengelompokan tingkat kedua: Kelompokkan berdasarkan kota dan hitung jumlah ID pesanan (total pesanan) untuk setiap kota, serta hitung jumlah pesanan maksimum untuk setiap kota. .addGroupBy(GroupByBuilders.groupByField("provinceName", "province") .addSubAggregation(AggregationBuilders.count("provinceOrderCounts", "order_id")) .addGroupBySorter(GroupBySorter.rowCountSortInDesc()) .addSubGroupBy(GroupByBuilders.groupByField("cityName", "city") .addSubAggregation(AggregationBuilders.count("cityOrderCounts", "order_id")) .addSubAggregation(AggregationBuilders.max("cityMaxAmount", "order_amount")) .addGroupBySorter(GroupBySorter.subAggSortInDesc("cityMaxAmount")))) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil pengelompokan tingkat pertama (total pesanan untuk setiap provinsi) GroupByFieldResult results = resp.getGroupByResults().getAsGroupByFieldResult("provinceName"); for (GroupByFieldResultItem item : results.getGroupByFieldResultItems()) { System.out.println("Provinsi:" + item.getKey() + "\tTotal Pesanan:" + item.getSubAggregationResults().getAsCountAggregationResult("provinceOrderCounts").getValue()); //Peroleh hasil pengelompokan tingkat kedua (total pesanan dan jumlah pesanan maksimum untuk setiap kota) GroupByFieldResult subResults = item.getSubGroupByResults().getAsGroupByFieldResult("cityName"); for (GroupByFieldResultItem subItem : subResults.getGroupByFieldResultItems()) { System.out.println("\t(Kota)" + subItem.getKey() + "\tTotal Pesanan:" + subItem.getSubAggregationResults().getAsCountAggregationResult("cityOrderCounts").getValue() + "\tJumlah Pesanan Maksimum:" + subItem.getSubAggregationResults().getAsMaxAggregationResult("cityMaxAmount").getValue()); } } }
Pengelompokan berdasarkan beberapa bidang
Metode agregasi ini mengelompokkan hasil kueri berdasarkan beberapa bidang. Anda dapat menggunakan token untuk melakukan paging.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
sources
Bidang berdasarkan mana Anda ingin mengelompokkan hasil kueri. Anda dapat mengelompokkan hasil kueri hingga 32 bidang dan melakukan operasi agregasi pada grup yang dihasilkan. Jenis grup berikut didukung:
GroupByField: Pengelompokan berdasarkan nilai bidang. Anda dapat mengonfigurasi parameter groupByName, fieldName, dan groupBySorter.
GroupByHistogram: Kueri berdasarkan histogram. Anda dapat mengonfigurasi parameter groupByName, fieldName, interval, dan groupBySorter.
GroupByDateHistogram: Kueri berdasarkan date histogram. Anda dapat mengonfigurasi parameter groupByName, fieldName, interval, timeZone, dan groupBySorter.
PentingUntuk item grup dalam sources, hanya pengurutan berdasarkan nilai grup (groupKeySort) dalam urutan kamus yang didukung. Secara default, grup diurutkan secara menurun.
Jika nilai bidang tidak ada untuk kolom tertentu, nilai dalam hasil yang dikembalikan akan NULL.
nextToken
Token paginasi yang digunakan untuk mengambil halaman data berikutnya. Secara default, parameter ini kosong.
Untuk permintaan pertama, atur nextToken ke kosong. Jika tidak semua data yang memenuhi kondisi kueri dikembalikan dalam satu permintaan, parameter nextToken dalam respons tidak kosong. Anda dapat menggunakan nextToken ini untuk kueri paginasi.
CatatanJika Anda perlu menyimpan nextToken atau mengirimkannya ke halaman frontend, kami sarankan Anda menggunakan pengkodean Base64 untuk mengkodekan nextToken sebagai string sebelum menyimpan atau mengirimkannya. NextToken itu sendiri bukan string. Jika Anda langsung menggunakan new String(nextToken) untuk pengkodean, informasi token akan hilang.
size
Jumlah grup per halaman. Nilai default: 10. Nilai maksimum: 2000.
PentingJika Anda ingin membatasi jumlah grup yang dikembalikan, dalam kebanyakan kasus, kami sarankan Anda mengonfigurasi parameter size.
Anda tidak dapat mengonfigurasi parameter size dan suggestedSize secara bersamaan.
suggestedSize
Jumlah grup yang akan dikembalikan. Anda dapat menentukan nilai lebih besar dari jumlah maksimum grup yang diizinkan di sisi server atau -1. Sisi server mengembalikan jumlah grup berdasarkan kapasitasnya.
Jika Anda mengatur parameter ini ke nilai yang lebih besar dari jumlah maksimum grup yang diizinkan di sisi server, sistem menyesuaikan nilai tersebut ke jumlah maksimum grup yang diizinkan di sisi server. Jumlah grup yang sebenarnya dikembalikan sama dengan min(suggestedSize, jumlah maksimum grup yang diizinkan di sisi server, jumlah total grup).
PentingParameter ini cocok untuk skenario di mana Anda menghubungkan Tablestore dengan mesin komputasi berkapasitas tinggi, seperti Apache Spark atau PrestoSQL.
subAggregations
Operasi sub-agregasi yang dapat dilakukan pada data di setiap grup, seperti menghitung nilai maksimum, jumlah, atau rata-rata.
subGroupBys
Operasi sub-pengelompokan yang dapat dilakukan pada data di setiap grup induk untuk mengelompokkan data lebih lanjut.
PentingParameter GroupByComposite tidak didukung dalam subGroupBy.
Contoh
/** * Kelompokkan dan agregasikan hasil kueri: Kelompokkan hasil kueri dan lakukan operasi agregasi pada grup yang dihasilkan berdasarkan parameter seperti groupbyField, groupByHistogram, dan groupByDataHistogram yang dilewatkan ke parameter SourceGroupBy. * Kembalikan hasil agregasi dari beberapa bidang dalam struktur datar. */ public static void groupByComposite(SyncClient client) { GroupByComposite.Builder compositeBuilder = GroupByBuilders .groupByComposite("groupByComposite") .size(2000) .addSources(GroupByBuilders.groupByField("groupByField", "Col_Keyword") .addGroupBySorter(GroupBySorter.groupKeySortInAsc()).build()) .addSources(GroupByBuilders.groupByHistogram("groupByHistogram", "Col_Long") .addGroupBySorter(GroupBySorter.groupKeySortInAsc()) .interval(5) .build()) .addSources(GroupByBuilders.groupByDateHistogram("groupByDateHistogram", "Col_Date") .addGroupBySorter(GroupBySorter.groupKeySortInAsc()) .interval(5, DateTimeUnit.DAY) .timeZone("+05:30").build()); SearchRequest searchRequest = SearchRequest.newBuilder() .indexName("<SEARCH_INDEX_NAME>") .tableName("<TABLE_NAME>") .returnAllColumnsFromIndex(true) .searchQuery(SearchQuery.newBuilder() .addGroupBy(compositeBuilder.build()) .build()) .build(); SearchResponse resp = client.search(searchRequest); while (true) { if (resp.getGroupByResults() == null || resp.getGroupByResults().getResultAsMap().size() == 0) { System.out.println("groupByComposite Result is null or empty"); return; } GroupByCompositeResult result = resp.getGroupByResults().getAsGroupByCompositeResult("groupByComposite"); if(!result.getSourceNames().isEmpty()) { for (String sourceGroupByNames: result.getSourceNames()) { System.out.printf("%s\t", sourceGroupByNames); } System.out.print("rowCount\t\n"); } for (GroupByCompositeResultItem item : result.getGroupByCompositeResultItems()) { for (String value : item.getKeys()) { String val = value == null ? "NULL" : value; System.out.printf("%s\t", val); } System.out.printf("%d\t\n", item.getRowCount()); } // Gunakan token untuk melalui grup. if (result.getNextToken() != null) { searchRequest.setSearchQuery( SearchQuery.newBuilder() .addGroupBy(compositeBuilder.nextToken(result.getNextToken()).build()) .build() ); resp = client.search(searchRequest); } else { break; } } }
Pengelompokan berdasarkan rentang
Metode agregasi ini mengelompokkan hasil kueri berdasarkan rentang nilai suatu bidang. Nilai dalam rentang tertentu dikelompokkan bersama, dan jumlah nilai dalam setiap rentang dikembalikan.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long dan Double yang didukung.
range[double_from, double_to)
Rentang nilai untuk pengelompokan.
Anda dapat mengatur double_from ke Double.MIN_VALUE untuk menentukan nilai minimum dan mengatur double_to ke Double.MAX_VALUE untuk menentukan nilai maksimum.
subAggregation dan subGroupBy
Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.
Sebagai contoh, setelah Anda mengelompokkan hasil kueri berdasarkan volume penjualan dan berdasarkan provinsi, Anda dapat memperoleh provinsi yang memiliki proporsi volume penjualan terbesar dalam rentang tertentu. Anda perlu menentukan GroupByField dalam GroupByRange untuk melakukan kueri ini.
Contoh
/** * Kelompokkan volume penjualan berdasarkan rentang [0, 1000), [1000, 5000), dan [5000, Double.MAX_VALUE) untuk memperoleh volume penjualan dalam setiap rentang. */ public void groupByRange(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) .addGroupBy(GroupByBuilders .groupByRange("name1", "column_number") .addRange(0, 1000) .addRange(1000, 5000) .addRange(5000, Double.MAX_VALUE) ) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. for (GroupByRangeResultItem item : resp.getGroupByResults().getAsGroupByRangeResult("name1").getGroupByRangeResultItems()) { //Tampilkan jumlah baris. System.out.println(item.getRowCount()); } }
Pengelompokan berdasarkan lokasi geografis
Metode agregasi ini mengelompokkan hasil kueri berdasarkan jarak dari lokasi geografis ke titik pusat. Hasil dalam rentang tertentu dikelompokkan bersama, dan jumlah nilai dalam setiap rentang dikembalikan.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Geo_point yang didukung.
origin(double lat, double lon)
Garis lintang dan garis bujur titik pusat.
double lat menentukan garis lintang titik pusat. double lon menentukan garis bujur titik pusat.
range[double_from, double_to)
Rentang jarak yang digunakan untuk pengelompokan. Satuan: meter.
Anda dapat mengatur double_from ke Double.MIN_VALUE untuk menentukan nilai minimum dan mengatur double_to ke Double.MAX_VALUE untuk menentukan nilai maksimum.
subAggregation dan subGroupBy
Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.
Contoh
/** * Kelompokkan pengguna berdasarkan lokasi geografis ke Wanda Plaza untuk memperoleh jumlah pengguna dalam setiap rentang jarak. Rentang jarak adalah [0, 1000), [1000, 5000), dan [5000, Double.MAX_VALUE). Satuan: meter. */ public void groupByGeoDistance(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) .addGroupBy(GroupByBuilders .groupByGeoDistance("name1", "column_geo_point") .origin(3.1, 6.5) .addRange(0, 1000) .addRange(1000, 5000) .addRange(5000, Double.MAX_VALUE) ) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi. for (GroupByGeoDistanceResultItem item : resp.getGroupByResults().getAsGroupByGeoDistanceResult("name1").getGroupByGeoDistanceResultItems()) { //Tampilkan jumlah baris. System.out.println(item.getRowCount()); } }
Pengelompokan berdasarkan filter
Metode agregasi ini menyaring hasil kueri dan mengelompokkannya berdasarkan setiap filter untuk memperoleh jumlah hasil yang cocok. Hasil dikembalikan sesuai urutan filter ditentukan.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
filter
Filter yang dapat digunakan untuk kueri. Hasil dikembalikan sesuai urutan filter ditentukan.
subAggregation dan subGroupBy
Operasi sub-agregasi. Anda dapat melakukan operasi sub-agregasi berdasarkan hasil pengelompokan.
Contoh
/** * Tentukan filter berikut untuk memperoleh jumlah item yang cocok dengan setiap filter: Volume penjualan melebihi 100, tempat asal adalah Zhejiang, dan deskripsi berisi Hangzhou. */ public void groupByFilter(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) .addGroupBy(GroupByBuilders .groupByFilter("name1") .addFilter(QueryBuilders.range("number").greaterThanOrEqual(100)) .addFilter(QueryBuilders.term("place","Zhejiang")) .addFilter(QueryBuilders.match("text","Hangzhou")) ) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = client.search(searchRequest); //Peroleh hasil agregasi berdasarkan urutan filter. for (GroupByFilterResultItem item : resp.getGroupByResults().getAsGroupByFilterResult("name1").getGroupByFilterResultItems()) { //Tampilkan jumlah baris. System.out.println(item.getRowCount()); } }
Statistik histogram
Metode agregasi ini mengelompokkan hasil kueri berdasarkan interval data tertentu. Nilai dalam rentang yang sama dikelompokkan bersama, dan rentang nilai serta jumlah nilai dalam setiap grup dikembalikan.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Long dan Double yang didukung.
interval
Interval data yang digunakan untuk memperoleh hasil agregasi.
fieldRange[min,max]
Rentang yang digunakan bersama dengan parameter interval untuk membatasi jumlah grup. Jumlah grup yang ditentukan menggunakan rumus
(fieldRange.max-fieldRange.min)/intervaltidak boleh melebihi 2.000.minDocCount
Jumlah baris minimum. Jika jumlah baris dalam suatu grup kurang dari jumlah baris minimum, hasil agregasi untuk grup tersebut tidak dikembalikan.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai parameter ini digunakan sebagai nilai bidang baris tersebut.
Contoh
/** * Kumpulkan statistik tentang distribusi pengguna berdasarkan kelompok usia. */ public static void groupByHistogram(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .tableName("<TABLE_NAME>") .indexName("<SEARCH_INDEX_NAME>") .searchQuery( SearchQuery.newBuilder() .addGroupBy(GroupByBuilders .groupByHistogram("groupByHistogram", "age") .interval(10) .minDocCount(0L) .addFieldRange(0, 99)) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = ots.search(searchRequest); //Peroleh hasil yang dikembalikan ketika operasi agregasi dilakukan. GroupByHistogramResult results = resp.getGroupByResults().getAsGroupByHistogramResult("groupByHistogram"); for (GroupByHistogramItem item : results.getGroupByHistogramItems()) { System.out.println("key:" + item.getKey().asLong() + " value:" + item.getValue()); } }
Kueri berdasarkan date histogram
Metode agregasi ini mengelompokkan hasil kueri berdasarkan interval tanggal tertentu. Nilai dalam rentang yang sama dikelompokkan bersama, dan rentang nilai serta jumlah nilai dalam setiap grup dikembalikan.
Fitur ini didukung oleh Tablestore SDK for Java V5.16.1 dan versi lebih baru. Untuk informasi tentang riwayat versi Tablestore SDK for Java, lihat Riwayat Versi Tablestore SDK for Java.
Parameter
Parameter
Deskripsi
groupByName
Nama unik dari operasi agregasi. Anda dapat meminta hasil dari operasi agregasi tertentu berdasarkan nama ini.
fieldName
Nama bidang yang digunakan untuk melakukan operasi agregasi. Hanya tipe Date yang didukung.
PentingTipe Date dari indeks pencarian didukung oleh Tablestore SDK for Java V5.13.9 dan versi lebih baru.
interval
Interval statistik.
fieldRange[min,max]
Rentang yang digunakan bersama dengan parameter interval untuk membatasi jumlah grup. Jumlah grup yang ditentukan menggunakan rumus
(fieldRange.max-fieldRange.min)/intervaltidak boleh melebihi 2.000.minDocCount
Jumlah baris minimum. Jika jumlah baris dalam sebuah grup kurang dari jumlah baris minimum, hasil agregasi untuk grup tersebut tidak dikembalikan.
missing
Nilai default untuk bidang tempat operasi agregasi dilakukan, yang diterapkan pada baris di mana nilai bidang kosong.
Jika Anda tidak menentukan nilai untuk parameter missing, baris akan diabaikan.
Jika Anda menentukan nilai untuk parameter missing, nilai dari parameter ini digunakan sebagai nilai bidang dari baris tersebut.
timeZone
Zona waktu dalam format
+hh:mmatau-hh:mm, seperti+08:00atau-09:00. Parameter ini hanya diperlukan ketika bidang bertipe Date.Jika parameter ini tidak ditentukan untuk bidang bertipe Date, offset N jam mungkin terjadi dalam hasil agregasi. Anda dapat menentukan parameter timeZone untuk mencegah masalah ini.
Contoh
/** * Kumpulkan statistik tentang distribusi harian data di bidang col_date dari pukul 10:00:00 pada 1 Mei 2017 hingga pukul 13:00:00 pada 21 Mei 2017. */ public static void groupByDateHistogram(SyncClient client) { //Buat pernyataan kueri. SearchRequest searchRequest = SearchRequest.newBuilder() .returnAllColumns(false) .indexName("<SEARCH_INDEX_NAME>") .tableName("<TABLE_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) .getTotalCount(false) .addGroupBy(GroupByBuilders.groupByDateHistogram("groupByDateHistogram", "col_date") .interval(1, DateTimeUnit.DAY) .minDocCount(1) .missing("2017-05-01 13:01:00") .fieldRange("2017-05-01 10:00", "2017-05-21 13:00:00")) .build()) .build(); //Eksekusi pernyataan kueri. SearchResponse resp = ots.search(searchRequest); //Peroleh hasil yang dikembalikan ketika operasi agregasi dilakukan. List<GroupByDateHistogramItem> items = resp.getGroupByResults().getAsGroupByDateHistogramResult("groupByDateHistogram").getGroupByDateHistogramItems(); for (GroupByDateHistogramItem item : items) { System.out.printf("millisecondTimestamp:%d, count:%d \n", item.getTimestamp(), item.getRowCount()); } }
Kueri baris yang diperoleh dari hasil operasi agregasi di setiap grup
Setelah mengelompokkan hasil kueri, Anda dapat menanyakan baris di setiap grup. Metode ini mirip dengan ANY_VALUE(bidang) dalam MySQL.
Saat menanyakan baris yang diperoleh dari hasil operasi agregasi di setiap grup, hasil yang dikembalikan hanya berisi informasi kunci utama jika indeks pencarian berisi bidang NESTED, GEOPOINT, atau ARRAY. Untuk memperoleh bidang yang diperlukan, Anda harus menanyakan tabel data.
Parameter
Parameter
Deskripsi
aggregationName
Nama unik dari operasi agregasi. Anda dapat menanyakan hasil operasi agregasi tertentu berdasarkan nama ini.
limit
Jumlah maksimum baris yang dapat dikembalikan untuk setiap grup. Secara default, hanya satu baris data yang dikembalikan.
sort
Metode pengurutan yang digunakan untuk mengurutkan data dalam grup.
columnsToGet
Bidang yang ingin Anda kembalikan. Hanya bidang dalam indeks pencarian yang didukung. Bidang Array, Date, Geopoint, dan Nested tidak didukung.
Nilai parameter ini sama dengan nilai parameter columnsToGet dalam SearchRequest. Anda hanya perlu menentukan nilai untuk parameter columnsToGet dalam SearchRequest.
Contoh
/** * Formulir aplikasi aktivitas sekolah berisi bidang di mana informasi seperti nama siswa, kelas, guru kepala, dan ketua kelas dapat ditentukan. Anda dapat mengelompokkan siswa berdasarkan kelas untuk melihat statistik aplikasi dan informasi properti setiap kelas. * Pernyataan SQL: select className, teacher, monitor, COUNT(*) as number from table GROUP BY className. */ public void testTopRows(SyncClient client) { SearchRequest searchRequest = SearchRequest.newBuilder() .indexName("<SEARCH_INDEX_NAME>") .tableName("<TABLE_NAME>") .searchQuery( SearchQuery.newBuilder() .query(QueryBuilders.matchAll()) .limit(0) .addGroupBy(GroupByBuilders.groupByField("groupName", "className") .size(5) //Tentukan jumlah grup yang ingin Anda kembalikan. Untuk informasi tentang nilai maksimum yang dapat Anda tentukan untuk jumlah grup yang dikembalikan, lihat deskripsi tentang jumlah grup yang dikembalikan oleh GroupByField dalam topik "Batas indeks pencarian". .addSubAggregation(AggregationBuilders.topRows("topRowsName") .limit(1) .sort(new Sort(Arrays.asList(new FieldSort("teacher", SortOrder.DESC)))) //Urutkan baris berdasarkan guru secara menurun. ) ) .build()) .addColumnsToGet(Arrays.asList("teacher", "monitor")) .build(); SearchResponse resp = client.search(searchRequest); List<GroupByFieldResultItem> items = resp.getGroupByResults().getAsGroupByFieldResult("groupName").getGroupByFieldResultItems(); for (GroupByFieldResultItem item : items) { String className = item.getKey(); long number = item.getRowCount(); List<Row> topRows = item.getSubAggregationResults().getAsTopRowsAggregationResult("topRowsName").getRows(); Row row = topRows.get(0); String teacher = row.getLatestColumn("teacher").getValue().asString(); String monitor = row.getLatestColumn("monitor").getValue().asString(); } }
Beberapa agregasi
Anda dapat melakukan beberapa operasi agregasi secara bersamaan.
Jika Anda melakukan beberapa operasi agregasi kompleks secara bersamaan, mungkin diperlukan waktu yang lama.
Gabungkan beberapa agregasi
public void multipleAggregation(SyncClient client) {
//Buat pernyataan kueri.
SearchRequest searchRequest = SearchRequest.newBuilder()
.tableName("<TABLE_NAME>")
.indexName("<SEARCH_INDEX_NAME>")
.searchQuery(
SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addAggregation(AggregationBuilders.min("name1", "long"))
.addAggregation(AggregationBuilders.sum("name2", "long"))
.addAggregation(AggregationBuilders.distinctCount("name3", "long"))
.build())
.build();
//Eksekusi pernyataan kueri.
SearchResponse resp = client.search(searchRequest);
//Peroleh nilai minimum dari hasil operasi agregasi.
System.out.println(resp.getAggregationResults().getAsMinAggregationResult("name1").getValue());
//Peroleh jumlah dari hasil operasi agregasi.
System.out.println(resp.getAggregationResults().getAsSumAggregationResult("name2").getValue());
//Peroleh jumlah nilai unik dari hasil operasi agregasi.
System.out.println(resp.getAggregationResults().getAsDistinctCountAggregationResult("name3").getValue());
}Gabungkan Agregasi dan GroupBy
public void multipleGroupBy(SyncClient client) {
//Buat pernyataan kueri.
SearchRequest searchRequest = SearchRequest.newBuilder()
.tableName("<TABLE_NAME>")
.indexName("<SEARCH_INDEX_NAME>")
.searchQuery(
SearchQuery.newBuilder()
.query(QueryBuilders.matchAll())
.limit(0)
.addAggregation(AggregationBuilders.min("name1", "long"))
.addAggregation(AggregationBuilders.sum("name2", "long"))
.addAggregation(AggregationBuilders.distinctCount("name3", "long"))
.addGroupBy(GroupByBuilders.groupByField("name4", "type"))
.addGroupBy(GroupByBuilders.groupByRange("name5", "long").addRange(1, 15))
.build())
.build();
//Eksekusi pernyataan kueri.
SearchResponse resp = client.search(searchRequest);
//Peroleh nilai minimum dari hasil operasi agregasi.
System.out.println(resp.getAggregationResults().getAsMinAggregationResult("name1").getValue());
//Peroleh jumlah dari hasil operasi agregasi.
System.out.println(resp.getAggregationResults().getAsSumAggregationResult("name2").getValue());
//Peroleh jumlah nilai unik dari hasil operasi agregasi.
System.out.println(resp.getAggregationResults().getAsDistinctCountAggregationResult("name3").getValue());
//Peroleh nilai GroupByField dari hasil operasi agregasi.
for (GroupByFieldResultItem item : resp.getGroupByResults().getAsGroupByFieldResult("name4").getGroupByFieldResultItems()) {
//Tampilkan kunci.
System.out.println(item.getKey());
//Tampilkan jumlah baris.
System.out.println(item.getRowCount());
}
//Peroleh nilai GroupByRange dari hasil operasi agregasi.
for (GroupByRangeResultItem item : resp.getGroupByResults().getAsGroupByRangeResult("name5").getGroupByRangeResultItems()) {
//Tampilkan jumlah baris.
System.out.println(item.getRowCount());
}
}Lampiran: Metode berbeda untuk pengelompokan multi-bidang
Untuk mengelompokkan hasil kueri berdasarkan beberapa bidang, Anda dapat menggunakan parameter groupBy dalam mode bersarang atau parameter GroupByComposite. Tabel berikut menjelaskan perbedaan antara parameter groupBy dalam mode bersarang dan parameter GroupByComposite.
Fitur | groupBy (bersarang) | Pengelompokan multi-bidang |
size | 2000 | 2000 |
Batas pada bidang | Hingga 3 tingkat didukung. | Hingga 32 tingkat didukung. |
Paginasi | Tidak didukung | Didukung dengan menggunakan parameter nextToken |
Aturan pengurutan untuk baris dalam grup |
| Dalam urutan abjad atau urutan abjad terbalik |
Mendukung agregasi | Ya | Ya |
Kompatibilitas | Untuk bidang bertipe Date, hasil kueri dikembalikan dalam format yang ditentukan. | Untuk bidang bertipe DATE, hasil kueri dikembalikan sebagai string timestamp. |
Referensi
Anda juga dapat merujuk ke topik berikut untuk menanyakan dan menganalisis data dalam tabel data.
Gunakan fitur kueri SQL dari Tablestore. Untuk informasi lebih lanjut, lihat Kueri SQL.
Hubungkan Tablestore ke platform big data, seperti DataWorks untuk melakukan kueri SQL dan analisis data. Untuk informasi lebih lanjut, lihat Hubungkan Tablestore ke Platform Big Data.
Hubungkan Tablestore ke mesin komputasi, seperti MaxCompute, Spark, Hive, HadoopMR, Function Compute, Flink, dan PrestoDB untuk melakukan kueri SQL dan analisis data. Untuk informasi lebih lanjut, lihat Ikhtisar.