Valori aggregati al momento della scrittura

Se vuoi aggregare i dati in Bigtable durante la scrittura, puoi utilizzare gli aggregati. Gli aggregati sono celle di una tabella Bigtable che aggregano i valori delle celle man mano che i dati vengono scritti. Quando aggiungi un nuovo valore, una funzione di aggregazione unisce il valore con il valore aggregato già presente nella cella. Altri database fanno riferimento a funzionalità simili a contatori o contatori distribuiti.

Il tipo di aggregazione offerto da Bigtable è somma. Quando aggiungi un valore a una cella di somma aggregata, il valore della cella viene sostituito con la somma del nuovo valore aggiunto e del valore della cella corrente.

Durante l'anteprima, puoi lavorare con i dati aggregati utilizzando l'interfaccia a riga di comando cbt e le librerie client di Bigtable per C++, Go e Java.

Questo documento fornisce una panoramica dei dati aggregati, mostra come creare una famiglia di colonne aggregate e fornisce esempi che mostrano come aggiungere un valore a una cella aggregata. Prima di leggere questo documento, dovresti acquisire familiarità con la panoramica di Bigtable e le Scritture.

Quando utilizzare i dati aggregati

I dati aggregati di Bigtable sono utili per le situazioni in cui sono importanti i dati di un'entità in forma aggregata e non come singoli punti dati. Se esegui la migrazione a Bigtable da database come Apache Cassandra o Redis, puoi utilizzare i dati aggregati di Bigtable in posizioni in cui in precedenza facevi affidamento sui contatori in questi sistemi.

Intervalli di tempo

Puoi utilizzare i bucket di tempo per ottenere valori aggregati per un periodo di tempo, ad esempio un'ora, un giorno o una settimana. Anziché aggregare i dati prima o dopo la scrittura nella tabella, aggiungi nuovi valori per aggregare le celle della tabella.

Ad esempio, se gestisci un servizio che aiuta gli enti di beneficenza a raccogliere fondi, potresti voler conoscere l'importo delle donazioni online giornaliere per ogni campagna, ma non è necessario conoscere l'orario esatto di ogni donazione o l'importo orario. Nella tabella, le chiavi di riga rappresentano gli ID degli enti di beneficenza e crei una famiglia di colonne aggregata denominata donations. I qualificatori di colonna nella riga sono ID campagna.

Ogni importo di donazione ricevuto per una campagna in un determinato giorno viene aggiunto alla somma nella cella aggregata della colonna per il giorno in questione. Ogni richiesta di aggiunta della cella utilizza un timestamp troncato all'inizio della giornata, in modo che in effetti ogni richiesta abbia lo stesso timestamp. Il troncamento dei timestamp assicura che tutte le donazioni di quel giorno vengano aggiunte alla stessa cella. Il giorno successivo, tutte le tue richieste vengono inserite in una nuova cella, utilizzando timestamp troncati alla nuova data, e questo pattern continua.

A seconda del tuo caso d'uso, potresti scegliere di creare nuove colonne per i nuovi aggregati. Per ulteriori informazioni sui bucket temporali, consulta Progettazione dello schema per i dati delle serie temporali.

Semplificazione dei flussi di lavoro

Gli aggregati ti consentono di aggregare i dati nella tabella Bigtable senza dover utilizzare ETL o software di elaborazione dei flussi di dati per aggregarli prima o dopo averli scritti in Bigtable. Ad esempio, se l'applicazione aveva pubblicato in precedenza messaggi in Pub/Sub e successivamente utilizzava Dataflow per leggere i messaggi e aggregarli prima di scriverli in Bigtable, puoi inviarli direttamente per aggregare le celle in Bigtable.

Famiglie di colonne aggregate

Per creare e aggiornare le celle aggregate, nella tabella devono essere presenti una o più famiglie di colonne aggregate, ovvero famiglie di colonne che contengono solo celle aggregate. Puoi crearle quando crei una tabella oppure aggiungere una famiglia di colonne aggregata a una tabella già in uso. Quando crei la famiglia di colonne, devi specificare il tipo di aggregazione, ad esempio la somma.

Non puoi convertire una famiglia di colonne contenente dati non aggregati in una famiglia di colonne aggregata. Le colonne nelle famiglie di colonne aggregate non possono contenere celle non aggregate, mentre le famiglie di colonne standard non possono contenere celle aggregate.

Per creare una nuova tabella con una famiglia di colonne aggregate, consulta Creare una tabella. Per aggiungere una famiglia di colonne aggregate a una tabella, consulta Aggiungere famiglie di colonne.

Tipi di aggregazione

Bigtable supporta il tipo di aggregazione sum. Il tipo di input supportato per le somme è Int64.

Timestamp

Una cella aggregata è definita da chiave di riga, famiglia di colonne, qualificatore di colonna e timestamp. Utilizzerai lo stesso timestamp ogni volta che aggiungi dati alla cella. Se invii un valore alla stessa chiave di riga, alla stessa famiglia di colonne e allo stesso qualificatore di colonna, ma con un timestamp diverso, viene creata una nuova cella aggregata nella colonna.

Una richiesta di aggiunta inviata a una cella aggregata deve includere un timestamp.

Tipo input

Il tipo di input del valore nella richiesta di aggiunta deve corrispondere al tipo di input con cui viene creata la famiglia di colonne. Ad esempio, se invii un valore stringa a una famiglia di colonne configurata per Int64, la richiesta viene rifiutata.

AddToCell

Una richiesta di aggiunta invia una mutazione AddToCell nell'API Bigtable Data. Al contrario, una richiesta di scrittura non aggregata invia una mutazione SetCell. Per ulteriori informazioni, consulta la documentazione sull'API di dati. Le operazioni AddToCell sono soggette agli stessi limiti delle operazioni delle altre mutazioni della tabella.

In una tabella replicata, una cella aggregata converge sullo stesso valore totale in tutti i cluster entro l'attuale ritardo di replica. Il valore totale è l'aggregazione di tutte le mutazioni AddToCell inviate a quella cella in tutti i cluster dall'ultima operazione di eliminazione o dalla creazione della cella.

Aggiungi esempi di richieste

I seguenti esempi mostrano come aggiungere un valore a una cella aggregata. Gli esempi si aggiungono a una somma in una famiglia di colonne che prevede il tipo di input Int64.

cbt

cbt addtocell TABLE_ID ROW_KEY FAMILY_NAME:COLUMN_QUALIFER=VALUE@TIMESTAMP

Sostituisci quanto segue:

  • TABLE_ID: l'identificatore permanente della tabella
  • ROW_KEY: la chiave di riga
  • FAMILY_NAME: il nome della famiglia di colonne aggregate
  • COLUMN_QUALIFIER: un identificatore per la colonna
  • VALUE: il valore da aggiungere alla cella
  • TIMESTAMP: un timestamp Unix in microsecondi, come 1710868850000000

Esempio:

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

Go

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.


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());
    }
  }
}

Passaggi successivi