Werte zum Schreibzeitpunkt aggregieren

Wenn Sie Ihre Daten zum Schreibzeitpunkt in Bigtable aggregieren möchten, Aggregatfunktionen Aggregate sind Bigtable-Tabellenzellen, aggregierte Zellenwerte, während die Daten geschrieben werden. Wenn Sie einen neuen Wert hinzufügen, Aggregationsfunktion 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.

Dieses Dokument bietet einen Überblick über Aggregatfunktionen. aggregierte Spaltenfamilie und enthält Beispiele, die zeigen, wie ein Wert zu einem aggregierte Zelle. Bevor Sie dieses Dokument lesen, sollten Sie mit den Bigtable Übersicht und Schreibvorgänge .

Wann sollten Aggregatfunktionen 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 die Migration von Datenbanken wie Apache Cassandra oder Redis verwenden können, können Sie Bigtable-Aggregate dort verwenden, in diesen Systemen auf Zähler angewiesen waren.

Zeit-Buckets

Sie können Zeit-Buckets verwenden, um zusammengefasste Werte für einen bestimmten Zeitraum zu erhalten, z. B. eine Stunde, einen Tag oder eine Woche. Anstatt Daten vor oder nach dem Schreiben zu aggregieren zu Ihrer Tabelle hinzufügen, 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 wissen, wie hoch die Onlinespenden pro Tag sind, aber Sie Sie müssen weder den genauen Zeitpunkt der einzelnen Spenden noch den Betrag pro Stunde kennen. In stehen die Zeilenschlüssel für die IDs gemeinnütziger Organisationen und Sie erstellen eine Familie namens donations. Die Spaltenbezeichner in der Zeile sind Kampagnen-IDs.

Da jeder für eine Kampagne an einem Tag eingegangene Spendenbetrag eingeht, wird er zur Summe in der aggregierten Zelle in der Spalte für diesen Tag addiert. 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 Zeit-Buckets finden Sie unter Schemadesign für Zeitreihen. Daten.

Arbeitsabläufe rationalisieren

Mit Aggregationen können Sie Ihre Daten in einer Bigtable-Tabelle aggregieren ohne dass eine ETL- oder Streaming-Verarbeitungssoftware zum bevor oder nachdem sie in Bigtable geschrieben wurden. 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.

Aggregierte Spaltenfamilien

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 mit nicht aggregierten Daten nicht in ein Aggregat-Spaltenfamilie. Spalten in aggregierten Spaltenfamilien dürfen keine Inhalte enthalten nicht aggregierte Zellen 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 aggregierten Zelle (sum) einen Wert hinzufügen, ist der Zellenwert durch die Summe des neu hinzugefügten Werts und des aktuellen Zellenwerts ersetzt. Die Der Eingabetyp, der für Summen unterstützt wird, ist Int64.

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 Eingabetyp, der für Max. unterstützt wird, 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 aggregierte Zelle wird durch Zeilenschlüssel, Spaltenfamilie, Spaltenqualifizierer und Zeitstempel. Sie verwenden immer denselben Zeitstempel, wenn Sie der Zelle Daten hinzufügen. Wenn Sie einen Wert an denselben Zeilenschlüssel, dieselbe Spaltenfamilie und denselben Spaltenqualifizierer senden, aber mit Zeitstempel ändern, 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 der die Spaltenfamilie erstellt wird. 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. 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 Vorgängen. Limits wie andere Tabellenmutationen.

In einer replizierten Tabelle konvergiert eine aggregierte Zelle innerhalb der aktuellen Replikationsverzögerung. 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 bei der automatischen Speicherbereinigung wie alle anderen Zellen behandelt: zum Löschen markiert ist, wird der Löschvorgang auf alle Cluster im Instanz. Weitere Informationen finden Sie unter Replikation und automatische Speicherbereinigung. erfasst werden. Wenn eine Anfrage zum Hinzufügen an eine aggregierte Zelle gesendet, die durch die automatische Speicherbereinigung entfernt wurde, aggregierte Zelle erstellt.

Anfragebeispiele hinzufügen

Die folgenden Beispiele zeigen, wie Sie einer aggregierten Zelle einen Wert hinzufügen. Die Die Beispiele addieren 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

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