Valori aggregati al momento della scrittura

Se vuoi aggregare i dati in Bigtable in fase di scrittura, possono utilizzare aggregates. Gli aggregati sono celle di tabelle Bigtable che aggregano i valori delle celle durante la scrittura dei dati. 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 come contatori o contatori distribuiti.

Puoi lavorare con i dati aggregati utilizzando Interfaccia a riga di comando cbt e le librerie client di Bigtable per C++, Go e Java.

Questo documento fornisce una panoramica degli 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, devi conoscere la panoramica di Bigtable e le scritture.

Quando utilizzare gli aggregati

I dati aggregati di Bigtable sono utili nelle situazioni in cui dati per un'entità in forma aggregata e non come singoli punti dati. Se di Cloud Bigtable da database come Apache Cassandra Redis, puoi utilizzare i dati aggregati di Bigtable che in precedenza faceva affidamento sui contatori di questi sistemi.

Bucket 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. Invece di aggregare i dati prima o dopo che sono stati scritti alla tabella, aggiungi nuovi valori per aggregare le celle della tabella.

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

Man mano che viene ricevuta ogni donazione ricevuta in un determinato giorno per una campagna, viene aggiunto alla somma nella cella aggregata nella colonna del giorno in questione. Ogni richiesta di aggiunta per la cella utilizza un timestamp troncato all'inizio della giornata, in modo che in pratica ogni richiesta abbia lo stesso timestamp. La troncatura dei timestamp garantisce che tutte le donazioni del giorno in questione vengano aggiunte alla stessa cella. Il giorno successivo, tutte le richieste vengono inserite in una nuova cella utilizzando timestamp troncati fino alla nuova data e questo schema continua.

A seconda del caso d'uso, puoi scegliere di creare nuove colonne per i nuovi aggregati. A seconda del numero di bucket che prevedi di accumulare, potresti prendere in considerazione un design diverso per la chiave di riga.

Per ulteriori informazioni sui bucket di tempo, consulta Progettazione dello schema per i dati delle serie temporali.

Semplificazione dei flussi di lavoro

Le aggregazioni ti consentono di aggregare i dati nella tabella Bigtable senza dover utilizzare software di elaborazione ETL o di streaming per aggregare i dati prima o dopo averli scritti in Bigtable. Ad esempio: se la tua applicazione ha pubblicato in precedenza messaggi in Pub/Sub utilizzato Dataflow per leggere i messaggi e aggregare i dati prima scrivendolo in Bigtable, puoi inviare i dati direttamente per aggregare le celle in Bigtable.

Famiglie di colonne aggregate

Per creare e aggiornare le celle aggregate, devi avere una o più famiglie di colonne nella tabella: famiglie di colonne che contengono solo dati aggregati celle. Puoi crearle quando crei una tabella oppure puoi aggiungere una famiglia di colonne aggregate a una tabella già in uso. Quando crei la famiglia di colonne, specifica il tipo di aggregazione, ad esempio somma.

Non puoi convertire una famiglia di colonne che contiene dati non aggregati in un una famiglia di colonne aggregate. Le colonne nelle famiglie di colonne aggregate non possono contenere celle non aggregate e le famiglie di colonne standard non possono contenere celle aggregate.

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

Tipi di aggregazione

Bigtable supporta i seguenti tipi di aggregazione:

Somma

Quando aggiungi un valore a una cella di aggregazione della somma (sum), il valore della cella viene sostituito con la somma del valore appena aggiunto e del valore attuale della cella. La il tipo di input supportato per le somme è Int64.

Minimo

Quando aggiungi un valore a una cella di aggregazione minima (min), il valore della cella è sostituito con il valore più basso tra il nuovo valore aggiunto e quello attuale valore della cella. Il tipo di input supportato per il valore minimo è Int64.

Massimo

Quando aggiungi un valore a una cella aggregata massima (max), il valore della cella viene sostituita con il valore più alto tra il valore appena aggiunto e il valore della cella corrente. Il tipo di input supportato al massimo è Int64.

HyperLogLog (HLL)

Quando aggiungi un valore a una cella aggregata HLL (inthll), il valore viene aggiunto a un insieme probabilistico di tutti i valori aggiunti dall'ultima reimpostazione (il creazione della cella o eliminazione dei suoi dati). Il valore della cella rappresenta lo stato dell'insieme. Per informazioni più generali sull'algoritmo HLL, consulta HyperLogLog.

Puoi leggere i valori HLL utilizzando la libreria Zetasketch. Per maggiori informazioni, consulta il repository GitHub di Zetasketch. La il tipo di input supportato per HLL è BYTES.

Timestamp

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

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 di 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 maggiori informazioni consulta la documentazione sull'API di dati riferimento. Le operazioni AddToCell sono soggette agli stessi limiti di operazioni delle altre mutazioni di tabelle.

In una tabella replicata, una cella aggregata converge per lo stesso valore finale in per tutti i cluster nell'attuale ritardo di replica. Il valore finale è la somma di tutte le mutazioni AddToCell inviate a quella cella in tutti i cluster dall'ultima operazione di eliminazione o dalla creazione della cella.

Garbage collection

Durante la garbage collection, le celle aggregate vengono trattate come qualsiasi altra cella: se cella viene contrassegnata per l'eliminazione, l'eliminazione viene replicata in tutti i cluster della in esecuzione in un'istanza Compute Engine. Per ulteriori informazioni, consulta Replica e raccolta del garbage. Se una richiesta di aggiunta viene inviata a una cella aggregata che è stata rimossa dalla raccolta dei rifiuti, viene creata una nuova cella aggregata.

Aggiungi esempi di richieste

I seguenti esempi mostrano come aggiungere un valore a una cella aggregata. Gli esempi si sommano 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, ad esempio 1710868850000000

Esempio:

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

Vai

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

Per autenticarti a Bigtable, configura le credenziali predefinite dell'applicazione. Per saperne di più, 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 autenticarti a Bigtable, configura le credenziali predefinite dell'applicazione. Per saperne di più, 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