Nilai agregat pada waktu tulis

Jika ingin menggabungkan data di Bigtable pada waktu penulisan, Anda dapat menggunakan agregat. Agregat adalah sel tabel Bigtable yang menggabungkan nilai sel saat data ditulis. Saat Anda menambahkan nilai baru, fungsi agregasi akan menggabungkan nilai dengan nilai gabungan yang sudah ada dalam sel. Database lain menyebut fungsi serupa dengan penghitung atau penghitung terdistribusi.

Jenis agregasi yang ditawarkan Bigtable adalah sum. Ketika Anda menambahkan nilai ke sel gabungan jumlah, nilai sel akan diganti dengan jumlah nilai yang baru ditambahkan dan nilai sel saat ini.

Selama Pratinjau, Anda dapat bekerja dengan agregat menggunakan CLI cbt dan library klien Bigtable untuk C++, Go, dan Java.

Dokumen ini memberikan ringkasan tentang agregat, menunjukkan cara membuat grup kolom gabungan, dan memberikan contoh yang menunjukkan cara menambahkan nilai ke sel gabungan. Sebelum membaca dokumen ini, Anda harus sudah memahami Ringkasan Bigtable dan Penulisan.

Kapan menggunakan agregat

Agregat Bigtable berguna untuk situasi saat Anda memerlukan data untuk suatu entity secara agregat dan bukan sebagai titik data individual. Jika bermigrasi ke Bigtable dari database seperti Apache Cassandra atau Redis, Anda dapat menggunakan agregat Bigtable di tempat yang sebelumnya Anda mengandalkan penghitung dalam sistem ini.

Periode waktu

Anda dapat menggunakan bucket waktu untuk mendapatkan nilai agregat selama jangka waktu tertentu, seperti jam, hari, atau minggu. Alih-alih menggabungkan data sebelum atau setelah ditulis ke tabel, Anda menambahkan nilai baru untuk menggabungkan sel dalam tabel.

Misalnya, jika Anda menjalankan layanan yang membantu badan amal menggalang dana, Anda mungkin ingin mengetahui jumlah donasi online per hari untuk setiap kampanye, tetapi Anda tidak perlu mengetahui waktu persis setiap donasi atau jumlahnya per jam. Di tabel, kunci baris merepresentasikan ID amal, dan Anda membuat grup kolom gabungan yang disebut donations. Penentu kolom dalam baris adalah ID kampanye.

Setiap jumlah donasi yang diterima untuk hari tertentu untuk kampanye akan ditambahkan ke jumlah di sel agregat di kolom untuk hari tersebut. Setiap permintaan tambahan untuk sel menggunakan stempel waktu yang dipotong di awal hari, sehingga setiap permintaan memiliki stempel waktu yang sama. Memotong stempel waktu akan memastikan bahwa semua donasi dari hari tersebut ditambahkan ke sel yang sama. Hari berikutnya, semua permintaan Anda masuk ke sel baru, menggunakan stempel waktu yang dipotong ke tanggal baru, dan pola tersebut berlanjut.

Bergantung pada kasus penggunaan, Anda dapat memilih untuk membuat kolom baru untuk agregat baru. Untuk mengetahui informasi selengkapnya tentang periode waktu, lihat Desain skema untuk data deret waktu.

Menyederhanakan alur kerja

Dengan agregat, Anda dapat menggabungkan data di tabel Bigtable tanpa perlu menggunakan software pemrosesan streaming atau ETL untuk menggabungkan data sebelum atau setelah menulisnya ke Bigtable. Misalnya, jika aplikasi Anda sebelumnya memublikasikan pesan ke Pub/Sub, lalu menggunakan Dataflow untuk membaca pesan dan menggabungkan data sebelum menulisnya ke Bigtable, Anda dapat mengirim data secara langsung untuk menggabungkan sel di Bigtable.

Menggabungkan grup kolom

Untuk membuat dan memperbarui sel gabungan, Anda harus memiliki satu atau beberapa kelompok kolom di tabel – grup kolom yang hanya berisi sel gabungan. Anda dapat membuatnya saat membuat tabel, atau menambahkan grup kolom agregat ke tabel yang sudah digunakan. Saat membuat grup kolom, Anda menentukan jenis agregasi, seperti sum.

Anda tidak dapat mengonversi grup kolom yang berisi data yang tidak digabungkan menjadi grup kolom gabungan. Kolom dalam grup kolom gabungan tidak boleh berisi sel yang tidak digabungkan, dan grup kolom standar tidak boleh berisi sel agregat.

Untuk membuat tabel baru dengan grup kolom gabungan, lihat Membuat tabel. Untuk menambahkan grup kolom gabungan ke tabel, lihat Menambahkan grup kolom.

Jenis agregasi

Bigtable mendukung jenis agregasi sum. Jenis input yang didukung untuk jumlah adalah Int64.

Stempel waktu

Sel agregat ditentukan oleh kunci baris, grup kolom, penentu kolom, dan stempel waktu. Anda menggunakan stempel waktu yang sama setiap kali Anda menambahkan data ke sel. Jika Anda mengirim nilai ke kunci baris, grup kolom, dan penentu kolom yang sama, tetapi dengan stempel waktu yang berbeda, sel gabungan baru akan dibuat di kolom tersebut.

Permintaan penambahan yang dikirim ke sel gabungan harus menyertakan stempel waktu.

Jenis masukan

Jenis input nilai dalam permintaan penambahan harus sesuai dengan jenis input yang digunakan untuk membuat grup kolom. Misalnya, jika Anda mengirim nilai string ke kelompok kolom yang dikonfigurasi untuk Int64, permintaan akan ditolak.

AddToCell

Permintaan penambahan mengirimkan mutasi AddToCell di Bigtable Data API. Sebaliknya, permintaan tulis non-agregat mengirim mutasi SetCell. Untuk mengetahui informasi selengkapnya, lihat Referensi Data API. Operasi AddToCell tunduk pada batas operasi yang sama dengan mutasi tabel lainnya.

Dalam tabel yang direplikasi, sel gabungan menyatu dengan total nilai yang sama di semua cluster dalam penundaan replikasi saat ini. Nilai total adalah gabungan dari semua mutasi AddToCell yang dikirim ke sel tersebut di semua cluster sejak operasi penghapusan terakhir, atau sejak sel dibuat.

Menambahkan contoh permintaan

Contoh berikut menunjukkan cara menambahkan nilai ke sel gabungan. Contoh ini menambahkan jumlah dalam grup kolom yang mengharapkan jenis input Int64.

cbt

cbt addtocell TABLE_ID ROW_KEY FAMILY_NAME:COLUMN_QUALIFER=VALUE@TIMESTAMP

Ganti kode berikut:

  • TABLE_ID: ID permanen untuk tabel
  • ROW_KEY: kunci baris
  • FAMILY_NAME: nama grup kolom gabungan
  • COLUMN_QUALIFIER: ID untuk kolom
  • VALUE: nilai yang akan ditambahkan ke sel
  • TIMESTAMP: stempel waktu Unix dalam mikrodetik, seperti 1710868850000000

Contoh:

cbt addtocell mobile-data device-1 updates:week12=100@1710868850000000

Go

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat Library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

import (
	"context"
	"fmt"
	"io"
	"time"

	"cloud.google.com/go/bigtable"
)

func writeAggregate(w io.Writer, projectID, instanceID string, tableName string) error {
	// projectID := "my-project-id"
	// instanceID := "my-instance-id"
	// tableName := "mobile-time-series"

	ctx := context.Background()
	client, err := bigtable.NewClient(ctx, projectID, instanceID)
	if err != nil {
		return fmt.Errorf("bigtable.NewClient: %w", err)
	}
	defer client.Close()
	tbl := client.Open(tableName)
	columnFamilyName := "view_count"
	viewTimestamp, err := time.Parse(time.RFC3339, "2024-03-13T12:41:34Z")
	if err != nil {
		return err
	}
	hourlyBucket := viewTimestamp.Truncate(time.Hour)

	mut := bigtable.NewMutation()
	mut.AddIntToCell(columnFamilyName, "views", bigtable.Time(hourlyBucket), 1)

	rowKey := "page#index.html"
	if err := tbl.Apply(ctx, rowKey, mut); err != nil {
		return fmt.Errorf("Apply: %w", err)
	}

	fmt.Fprintf(w, "Successfully wrote row: %s\n", rowKey)
	return nil
}

Java

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat Library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.


import com.google.cloud.bigtable.data.v2.BigtableDataClient;
import com.google.cloud.bigtable.data.v2.models.RowMutation;
import java.time.Instant;
import java.time.temporal.ChronoUnit;

public class WriteAggregate {
  private static final String COUNT_COLUMN_FAMILY_NAME = "view_count";
  private static final long MICROS_PER_MILLI = 1000;

  public static void writeAggregate(String projectId, String instanceId, String tableId) {
    // String projectId = "my-project-id";
    // String instanceId = "my-instance-id";
    // String tableId = "page-view-counter";

    try (BigtableDataClient dataClient = BigtableDataClient.create(projectId, instanceId)) {

      String rowKey = "page#index.html";
      Instant viewTimestamp = Instant.parse("2024-03-13T12:41:34.123Z");

      // Bucket the views for an hour into a single count, giving us an hourly view count for a
      // given page.
      Instant hourlyBucket = viewTimestamp.truncatedTo(ChronoUnit.HOURS);
      long hourlyBucketMicros = hourlyBucket.toEpochMilli() * MICROS_PER_MILLI;

      RowMutation rowMutation =
          RowMutation.create(tableId, rowKey)
              .addToCell(COUNT_COLUMN_FAMILY_NAME, "views", hourlyBucketMicros, 1);

      dataClient.mutateRow(rowMutation);
      System.out.printf("Successfully wrote row %s", rowKey);

    } catch (Exception e) {
      System.out.println("Error during WriteAggregate: \n" + e.toString());
    }
  }
}

Langkah selanjutnya