Valori aggregati al momento della scrittura

Se vuoi aggregare i dati in Bigtable in fase di scrittura, possono utilizzare aggregate. I dati aggregati sono celle delle tabelle Bigtable aggregare i valori delle celle quando i dati vengono scritti. Quando aggiungi un nuovo valore, funzione di aggregazione unisce il valore al valore aggregato già nella cella. Altri database fanno riferimento a funzionalità simili come i contatori o contatori distribuiti.

Durante l'anteprima, 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 dei dati aggregati e mostra come creare famiglia di colonne aggregata e fornisce esempi che mostrano come aggiungere un valore a una cella aggregata. Prima di leggere questo documento, dovresti conoscere gli Bigtable panoramica e Scritture .

Quando utilizzare i dati 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 relativi a 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 gli enti di beneficenza a raccogliere fondi, potresti vuoi conoscere la quantità di donazioni online al giorno per ogni campagna, ma non occorre conoscere l'ora esatta di ogni donazione o l'importo per ora. Nel della tabella, le chiavi di riga rappresentano gli ID ente di beneficenza e tu crei una colonna aggregata donations. I qualificatori di colonna nella riga sono gli 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 aggiunta per la cella utilizza un timestamp troncato all'inizio del giorno, quindi che ogni richiesta abbia lo stesso timestamp. Troncamento dei timestamp assicura che tutte le donazioni di quel giorno vengano aggiunte alla stessa cella. La il giorno successivo, tutte le richieste vengono inserite in una nuova cella, utilizzando i timestamp indicati viene troncato alla nuova data e il pattern continua.

A seconda del caso d'uso, potresti scegliere di creare nuove colonne per il nuovo aggregati. A seconda del numero di bucket che prevedi potresti prendere in considerazione una struttura della chiave di riga diversa.

Per ulteriori informazioni sui bucket temporali, consulta la sezione Progettazione di uno schema per le serie temporali. i tuoi dati.

Semplificazione dei flussi di lavoro

I dati aggregati consentono di aggregare i dati nella tabella Bigtable senza dover utilizzare alcun ETL o software di elaborazione dei flussi di dati per aggregare 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 scrivere 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 aggiungere un insieme a una tabella già in uso. Quando crei la colonna puoi specificare il tipo di aggregazione, come "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 colonna aggregata a una tabella, consulta Aggiungere colonne famiglie.

Tipi di aggregazione

Bigtable supporta i seguenti tipi di aggregazione:

  • sum. Quando aggiungi un valore a una cella di aggregazione di somma, il valore della cella è sostituito con la somma del valore appena aggiunto e del valore attuale della cella. Il tipo di input supportato per le somme è Int64.
  • min. Quando aggiungi un valore a una cella aggregata minima, 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.
  • max. Quando aggiungi un valore a una cella aggregata massima, il valore della cella è sostituito con il valore più alto tra il nuovo valore aggiunto e quello attuale valore della cella. Il tipo di input supportato al massimo è Int64.

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 stringa a un famiglia di colonne configurata per Int64, la richiesta è stata 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 riferimento . Le operazioni AddToCell sono soggette alle stesse operazioni limiti delle altre mutazioni delle tabelle.

In una tabella replicata, una cella aggregata converge per lo stesso valore totale in per tutti i cluster nell'attuale ritardo di replica. Il valore totale è aggregato di tutte le mutazioni (AddToCell) inviate a quella cella in tutti i cluster dal giorno 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. La esempi vengono aggiunti 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 eseguire l'autenticazione su Bigtable, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura 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 su Bigtable, configura le Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura 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