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 beziehen sich auf ähnliche Funktionen wie Zähler oder verteilte Zähler.

Bigtable bietet den Aggregationstyp sum. Wenn Sie addiert einen Wert in eine zusammengefasste Zelle, wird der Zellenwert durch die Summe den neu hinzugefügten Wert und den aktuellen Zellenwert.

In der Vorschau können Sie mithilfe der Funktion cbt-Befehlszeile und die 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-Aggregate sind nützlich für Situationen, in denen aggregierte Daten für eine Entität und nicht als einzelne Datenpunkte. 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 Spaltenqualifizierer 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 ganz ohne ETL- oder Streaming-Verarbeitungssoftware um Ihre Daten zu aggregieren, bevor oder nachdem Sie sie in Bigtable geschrieben haben. Wenn Ihre Anwendung beispielsweise zuvor Nachrichten auf Pub/Sub an und nutzte Dataflow, um die Nachrichten zu lesen. bevor Sie sie in Bigtable schreiben, könnten Sie sondern direkt an die aggregierten Zellen in Bigtable senden.

Aggregierte Spaltenfamilien

Zum Erstellen und Aktualisieren von aggregierten Zellen benötigen Sie eine oder mehrere Aggregatzellen Spaltenfamilien in Ihrer Tabelle – Spaltenfamilien, die nur aggregierte Daten enthalten Zellen. 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 Daten enthalten Zellen.

Informationen zum Erstellen einer neuen Tabelle mit einer aggregierten Spaltenfamilie finden Sie unter Ein Tabelle. Bis einer Tabelle eine aggregierte Spaltenfamilie hinzufügen, siehe Spalte hinzufügen Familien.

Zusammenfassungstypen

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

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 dieselbe Spalte senden aber mit einem anderen Zeitstempel, wird im Bereich Spalte.

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 den Bigtable-Daten. API. Im Gegensatz dazu wird bei einer nicht aggregierten Schreibanfrage die Mutation SetCell gesendet. Für finden Sie in der Data API-Referenz AddToCell-Vorgänge unterliegen denselben Betriebslimits wie andere Tabellenmutationen.

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

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