Werte zum Schreibzeitpunkt aggregieren

Wenn Sie Ihre Daten zum Schreibzeitpunkt in Bigtable aggregieren möchten, können Sie Aggregatfunktionen verwenden. Aggregierte sind Bigtable-Tabellenzellen, die Zellenwerte aggregieren, während die Daten geschrieben werden. Wenn Sie einen neuen Wert hinzufügen, führt eine Aggregationsfunktion den Wert mit dem aggregierten Wert zusammen, der sich bereits in der Zelle befindet. Andere Datenbanken beziehen sich auf ähnliche Funktionen wie Zähler oder verteilte Zähler.

Bigtable bietet den Aggregationstyp sum. Wenn Sie einer aggregierten Zelle einen Wert hinzufügen, wird der Zellenwert durch die Summe des neu hinzugefügten Werts und des aktuellen Zellenwerts ersetzt.

In der Vorabversion können Sie über die cbt-Befehlszeile und die Bigtable-Clientbibliotheken für C++, Go und Java mit Aggregatfunktionen arbeiten.

Dieses Dokument bietet einen Überblick über aggregierte Daten, zeigt, wie eine aggregierte Spaltenfamilie erstellt wird, und enthält Beispiele, die zeigen, wie einer aggregierten Zelle ein Wert hinzugefügt wird. Bevor Sie dieses Dokument lesen, sollten Sie sich mit den Informationen unter Bigtable – Übersicht und Schreibvorgänge vertraut gemacht haben.

Wann sollten Aggregatfunktionen verwendet werden?

Bigtable-Aggregate sind nützlich, wenn Daten für eine Entität in aggregierter Form und nicht als einzelne Datenpunkte wichtig sind. Bei der Migration von Datenbanken wie Apache Cassandra oder Redis zu Bigtable können Sie Bigtable-Aggregatfunktionen dort verwenden, wo Sie sich bisher auf Zähler in diesen Systemen verlassen haben.

Zeit-Buckets

Sie können Zeit-Buckets verwenden, um aggregierte Werte für einen bestimmten Zeitraum abzurufen, z. B. eine Stunde, einen Tag oder eine Woche. Anstatt Daten vor oder nach dem Schreiben in die Tabelle zu aggregieren, fügen Sie neue Werte hinzu, um Zellen in der Tabelle zu aggregieren.

Wenn Sie beispielsweise einen Dienst betreiben, mit dem gemeinnützige Organisationen Geld sammeln können, möchten Sie vielleicht die Höhe der Onlinespenden pro Tag für jede Kampagne wissen, aber nicht den genauen Zeitpunkt der einzelnen Spenden oder den genauen Betrag pro Stunde. In Ihrer Tabelle stellen Zeilenschlüssel die IDs der gemeinnützigen Organisationen dar und Sie erstellen eine aggregierte Spaltenfamilie mit dem Namen donations. Die Spaltenqualifizierer in der Zeile sind Kampagnen-IDs.

Da jeder für eine Kampagne an einem bestimmten Tag eingegangene Spendenbetrag eingeht, wird er zur Summe in der aggregierten Zelle in der Spalte für diesen Tag addiert. Jede Hinzufügungsanfrage für die Zelle verwendet einen Zeitstempel, der auf den Anfang des Tages gekürzt wird, sodass praktisch jede Anfrage denselben Zeitstempel hat. Durch das Abschneiden der Zeitstempel wird sichergestellt, dass alle Spenden von diesem Tag derselben Zelle hinzugefügt werden. Am nächsten Tag werden alle Ihre Anfragen mit Zeitstempeln, die auf das neue Datum gekürzt werden, in eine neue Zelle eingefügt und dieses Muster wird fortgesetzt.

Je nach Anwendungsfall können Sie stattdessen neue Spalten für die neuen Zusammenfassungen erstellen. Je nach Anzahl der Buckets, die Sie akkumulieren möchten, können Sie ein anderes Zeilenschlüsseldesign in Betracht ziehen.

Weitere Informationen zu Zeit-Buckets finden Sie unter Schemadesign für Zeitachsendaten.

Arbeitsabläufe rationalisieren

Mit Aggregationen können Sie Ihre Daten in Ihrer Bigtable-Tabelle aggregieren, ohne ETL- oder Streaming-Verarbeitungssoftware verwenden zu müssen, um die Daten vor oder nach dem Schreiben in Bigtable zu aggregieren. Wenn Ihre Anwendung beispielsweise zuvor Nachrichten in Pub/Sub veröffentlicht und dann Dataflow verwendet hat, um die Nachrichten zu lesen und die Daten zu aggregieren, bevor sie in Bigtable geschrieben wurden, können Sie die Daten stattdessen direkt an aggregierte Zellen in Bigtable senden.

Aggregierte Spaltenfamilien

Zum Erstellen und Aktualisieren von aggregierten Zellen müssen Sie eine oder mehrere Aggregatspaltenfamilien in Ihrer Tabelle haben – Spaltenfamilien, die nur aggregierte Zellen enthalten. Sie können sie zusammen mit einer Tabelle erstellen oder einer bereits verwendeten Tabelle eine aggregierte Spaltenfamilie hinzufügen. Wenn Sie die Spaltenfamilie erstellen, geben Sie den Zusammenfassungstyp an, z. B. die Summe.

Sie können eine Spaltenfamilie mit nicht aggregierten Daten nicht in eine zusammengefasste Spaltenfamilie umwandeln. Spalten in aggregierten Spaltenfamilien dürfen keine nicht aggregierten Zellen enthalten und Standardspaltenfamilien keine aggregierten Zellen.

Informationen zum Erstellen einer neuen Tabelle mit einer aggregierten Spaltenfamilie finden Sie unter Tabelle erstellen. Informationen zum Hinzufügen einer aggregierten Spaltenfamilie zu einer Tabelle finden Sie unter Spaltenfamilien hinzufügen.

Zusammenfassungstypen

Bigtable unterstützt den Aggregationstyp sum. Der Eingabetyp, der für Summen unterstützt wird, ist Int64.

Zeitstempel

Eine aggregierte Zelle wird durch Zeilenschlüssel, Spaltenfamilie, Spaltenqualifizierer und Zeitstempel definiert. Sie verwenden immer denselben Zeitstempel, wenn Sie der Zelle Daten hinzufügen. Wenn Sie einen Wert mit einem anderen Zeitstempel an denselben Zeilenschlüssel, dieselbe Spaltenfamilie und denselben Spaltenqualifizierer senden, wird in der Spalte eine neue aggregierte Zelle erstellt.

Eine Anfrage zum Hinzufügen, die an eine aggregierte Zelle gesendet wird, muss einen Zeitstempel enthalten.

Eingabetyp

Der Eingabetyp des Werts in der Anfrage zum Hinzufügen muss dem Eingabetyp entsprechen, mit dem die Spaltenfamilie erstellt wird. Wenn Sie beispielsweise einen Stringwert an eine Spaltenfamilie senden, die für Int64 konfiguriert ist, wird die Anfrage abgelehnt.

AddToCell

Eine Hinzufügungsanfrage sendet die Mutation AddToCell in der Bigtable Data API. Im Gegensatz dazu wird bei einer nicht aggregierten Schreibanfrage die Mutation SetCell gesendet. Weitere Informationen finden Sie in der Data API-Referenz. AddToCell-Vorgänge unterliegen denselben Vorgangslimits wie andere Tabellenmutationen.

In einer replizierten Tabelle konvergiert eine aggregierte Zelle innerhalb der aktuellen Replikationsverzögerung zum selben Gesamtwert in allen Clustern. Der Gesamtwert ist die Summe aller AddToCell-Mutationen, die seit dem letzten Löschvorgang oder seit dem Erstellen der Zelle an diese Zelle in allen Clustern gesendet wurden.

Anfragebeispiele hinzufügen

Die folgenden Beispiele zeigen, wie Sie einer aggregierten Zelle einen Wert hinzufügen. Die Beispiele ergänzen eine Summe in einer Spaltenfamilie, die den Eingabetyp Int64 erwartet.

cbt

cbt addtocell TABLE_ID ROW_KEY FAMILY_NAME:COLUMN_QUALIFER=VALUE@TIMESTAMP

Ersetzen Sie Folgendes:

  • TABLE_ID: Die permanente Kennzeichnung der Tabelle
  • ROW_KEY: der Zeilenschlüssel
  • FAMILY_NAME: der Name der aggregierten Spaltenfamilie
  • COLUMN_QUALIFIER: eine Kennzeichnung für die Spalte
  • VALUE: Wert, der der Zelle hinzugefügt werden soll
  • TIMESTAMP: ein Unix-Zeitstempel in Mikrosekunden, z. B. 1710868850000000

Beispiel:

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

Einfach loslegen (Go)

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.


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

Nächste Schritte