Werte zum Schreibzeitpunkt aggregieren

Wenn Sie Ihre Daten zum Schreibzeitpunkt in Bigtable aggregieren möchten, aggregates Aggregate sind Bigtable-Tabellenzellen, aggregierte Zellenwerte, während die Daten geschrieben werden. Wenn Sie einen neuen Wert hinzufügen, und führt den Wert mit dem aggregierten Wert zusammen, der bereits in die Zelle ein. Andere Datenbanken bezeichnen ähnliche Funktionen als Zähler oder verteilte Zähler.

Sie können mit Aggregaten arbeiten, indem Sie die cbt-Befehlszeile und Bigtable-Clientbibliotheken für C++, Go und Java.

In diesem Dokument finden Sie einen Überblick über Aggregate, eine Anleitung zum Erstellen einer Aggregate-Spaltenfamilie und Beispiele zum Hinzufügen eines Werts zu einer Aggregate-Zelle. Bevor Sie dieses Dokument lesen, sollten Sie mit den Bigtable Übersicht und Schreibvorgänge .

Wann sollten Aggregate verwendet werden?

Bigtable-Aggregationen sind nützlich, wenn Sie Daten für eine Entität insgesamt und nicht als einzelne Datenpunkte benötigen. Wenn Sie von Datenbanken wie Apache Cassandra oder Redis zu Bigtable migrieren, können Sie Bigtable-Aggregationen an Stellen verwenden, an denen Sie zuvor Zähler in diesen Systemen verwendet haben.

Zeit-Buckets

Sie können Zeit-Buckets verwenden, um aggregierte Werte für einen bestimmten Zeitraum zu erhalten, 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 anbieten, mit dem Wohltätigkeitsorganisationen Geld sammeln können, möchten Sie vielleicht die Anzahl der Onlinespenden pro Tag für jede Kampagne wissen. Sie müssen jedoch nicht die genaue Uhrzeit jeder Spende oder den Betrag pro Stunde kennen. In Ihrer Tabelle stehen Zeilenschlüssel für IDs von Wohltätigkeitsorganisationen und Sie erstellen eine aggregierte Spaltenfamilie namens donations. Die Spaltenqualifizierer in der Zeile sind Kampagnen-IDs.

Jeder für einen bestimmten Tag für eine Kampagne eingegangene Spendenbetrag wird der Summe in der Summenzelle in der Spalte für diesen Tag hinzugefügt. Jede Anzeige verwendet einen Zeitstempel, der auf den Anfang des Tages gekürzt ist. dass jede Anfrage denselben Zeitstempel hat. Zeitstempel kürzen stellt sicher, dass alle Spenden von diesem Tag derselben Zelle hinzugefügt werden. Die werden am nächsten Tag alle Anfragen mit Zeitstempeln, bis zum neuen Datum gekürzt wird, und dieses Muster setzt sich fort.

Je nach Anwendungsfall können Sie neue Spalten für Ihre neuen Aggregatfunktionen. Je nach Anzahl der Buckets, die Sie können Sie ein anderes Zeilenschlüsseldesign in Betracht ziehen.

Weitere Informationen zu Zeitblöcken finden Sie unter Schemadesign für Zeitachsendaten.

Arbeitsabläufe rationalisieren

Mit Aggregaten können Sie Ihre Daten in Ihrer Bigtable-Tabelle zusammenfassen, ohne dass Sie vor oder nach dem Schreiben in Bigtable eine ETL- oder Streaming-Verarbeitungssoftware verwenden müssen. Beispiel: wenn Ihre Anwendung bereits Nachrichten in Pub/Sub veröffentlicht hat. verwendet Dataflow, um die Nachrichten zu lesen und die Daten zu aggregieren, in Bigtable schreiben, können Sie die Daten stattdessen auch direkt um Zellen in Bigtable zu aggregieren.

Spaltenfamilien zusammenführen

Wenn Sie Summenzellen erstellen und aktualisieren möchten, müssen Sie in Ihrer Tabelle eine oder mehrere Summenspaltenfamilien haben. Das sind Spaltenfamilien, die nur Summenzellen enthalten. Sie können sie zusammen mit einer Tabelle erstellen oder eine Aggregation hinzufügen. Spaltenfamilie zu einer Tabelle hinzu, die bereits verwendet wird. Beim Erstellen der Spalte geben Sie den Zusammenfassungstyp an, z. B. sum.

Sie können eine Spaltenfamilie, die keine aggregierten Daten enthält, nicht in eine aggregierte Spaltenfamilie umwandeln. Spalten in Aggregierungsspaltenfamilien dürfen keine nicht aggregierten Zellen enthalten und Standardspaltenfamilien dürfen keine aggregierten Zellen enthalten.

Informationen zum Erstellen einer neuen Tabelle mit einer aggregierten Spaltenfamilie finden Sie unter Ein Tabelle. So fügen Sie eine zusammengefasste Spalte hinzu: zu einer Tabelle hinzufügen, siehe Spalte hinzufügen Familien.

Zusammenfassungstypen

Bigtable unterstützt die folgenden Aggregationstypen:

Summe

Wenn Sie einer Summensummezelle (sum) einen Wert hinzufügen, wird der Zellenwert durch die Summe des neu hinzugefügten Werts und des aktuellen Zellenwerts ersetzt. Für Summen wird der Eingabetyp Int64 unterstützt.

Minimum

Wenn Sie einer Mindestgesamtzellen (min) einen Wert hinzufügen, wird der Zellenwert durch den niedrigeren Wert zwischen dem neu hinzugefügten Wert und dem aktuellen Zellenwert ersetzt. Der Eingabetyp, der für Min. unterstützt wird, ist Int64.

Maximum

Wenn Sie einer maximalen aggregierten Zelle (max) einen Wert hinzufügen, ist der Zellenwert durch den höheren Wert zwischen dem neuen und dem aktuellen Wert ersetzt. Zellenwert. Der für „max“ unterstützte Eingabetyp ist Int64.

HyperLogLog (HLL)

Wenn Sie einer aggregierten HLL-Zelle (inthll) einen Wert hinzufügen, wird der Wert eine probabilistische Menge aller Werte, die seit der letzten Zurücksetzung hinzugefügt wurden (entweder Erstellung der Zelle oder das Löschen ihrer Daten). Der Zellenwert steht für Status dieses Satzes. Allgemeine Informationen zum HLL-Algorithmus finden Sie unter HyperLogLog.

Sie können HLL-Werte mit der Zetasketch-Bibliothek lesen. Weitere Informationen finden Sie unter Das GitHub-Repository von Zetasketch. Der für HLL unterstützte Eingabetyp ist BYTES.

Zeitstempel

Eine Summenzelle wird durch den Zeilenschlüssel, die Spaltenfamilie, den Spaltenqualifizierer und den Zeitstempel definiert. Sie verwenden immer denselben Zeitstempel, wenn Sie der Zelle Daten hinzufügen. Wenn Sie einen Wert mit demselben Zeilenschlüssel, derselben Spaltenfamilie und demselben Spaltenqualifizierer, aber mit einem anderen Zeitstempel senden, wird in der Spalte eine neue Aggregierungszelle erstellt.

Eine an eine Summenzelle gesendete Anfrage zum Hinzufügen muss einen Zeitstempel enthalten.

Eingabetyp

Der Eingabetyp des Werts in der Hinzufügeanfrage muss mit dem Eingabetyp übereinstimmen, mit dem die Spaltenfamilie erstellt wurde. Wenn Sie beispielsweise einen Stringwert an einen Spaltenfamilie für Int64 konfiguriert ist, wird die Anfrage abgelehnt.

AddToCell

Eine Hinzufügungsanfrage sendet die Mutation AddToCell in der Bigtable Data API. Bei einer nicht zusammengefassten Schreibanfrage wird dagegen eine SetCell-Mutation gesendet. Weitere Informationen finden Sie unter Data API Referenz. AddToCell-Vorgänge unterliegen denselben Vorgängen. Limits wie andere Tabellenmutationen.

In einer replizierten Tabelle konvergiert eine Aggregierungszelle in allen Clustern innerhalb der aktuellen Replikationsverzögerung auf denselben Endwert. Der endgültige Wert ist der Zusammenfassung aller AddToCell Mutationen, die seitdem in allen Clustern an diese Zelle gesendet wurden oder seit der Erstellung der Zelle ausgeführt wurde.

Automatische Speicherbereinigung

Aggregierte Zellen werden beim Garbage Collection wie jede andere Zelle behandelt: Wenn eine Zelle zum Löschen markiert wird, wird das Löschen auf alle Cluster in der Instanz repliziert. Weitere Informationen finden Sie unter Replikation und Garbage Collection. Wenn eine Anfrage zum Hinzufügen an eine aggregierte Zelle gesendet, die durch die automatische Speicherbereinigung entfernt wurde, aggregierte Zelle erstellt.

Anfragebeispiele hinzufügen

In den folgenden Beispielen wird gezeigt, wie Sie einer Summenzelle einen Wert hinzufügen. In den Beispielen werden Werte in einer Spaltenfamilie addiert, für die der Eingabetyp Int64 erwartet wird.

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 Kennung für die Spalte
  • VALUE: Der 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

Go

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

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. 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