Aggregierte Werte zum Schreibzeitpunkt

Wenn Sie Ihre Daten in Bigtable zum Schreibzeitpunkt aggregieren möchten, können Sie Aggregatfunktionen verwenden. Aggregatwerte sind Bigtable-Tabellenzellen, in denen beim Schreiben der Daten Zellenwerte aggregiert werden. Wenn Sie einen neuen Wert hinzufügen, führt eine Aggregatfunktion den Wert mit dem aggregierten Wert zusammen, der sich bereits in der Zelle befindet. Andere Datenbanken beziehen sich auf eine ähnliche Funktionalität wie Zähler oder verteilte Zähler.

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

Während der Vorabversion können Sie über die cbt-Befehlszeile und die Bigtable-Clientbibliotheken für C++, Go und Java mit aggregierten Daten 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 machen.

Wann werden aggregierte Daten verwendet?

Bigtable-Aggregatfunktionen sind in Situationen nützlich, in denen Daten für eine Entität in aggregierter Form und nicht als einzelne Datenpunkte wichtig sind. Wenn Sie von Datenbanken wie Apache Cassandra oder Redis zu Bigtable migrieren, können Sie Bigtable-Aggregatfunktionen an Stellen verwenden, an denen Sie sich in diesen Systemen zuvor auf Zähler verlassen haben.

Zeit-Buckets

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

Wenn Sie beispielsweise einen Dienst betreiben, der Wohltätigkeitsorganisationen dabei hilft, Geld zu sammeln, möchten Sie vielleicht wissen, wie viel Onlinespenden pro Tag für jede Kampagne anfallen. Sie müssen jedoch nicht die genaue Uhrzeit oder den Betrag pro Stunde kennen. In der Tabelle stellen die 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.

Wenn jeder Spendenbetrag eingeht, der an einem bestimmten Tag für eine Kampagne 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 auf den Beginn des Tages gekürzten Zeitstempel, sodass jede Anfrage denselben Zeitstempel hat. Durch das Kürzen 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 bis zum neuen Datum abgeschnitten sind, in eine neue Zelle geleitet. Dieses Muster wird fortgesetzt.

Je nach Anwendungsfall können Sie stattdessen neue Spalten für die neuen Zusammenfassungen erstellen. Weitere Informationen zu Zeit-Buckets finden Sie unter Schemadesign für Zeitreihendaten.

Workflows optimieren

Mit Aggregatfunktionen können Sie Daten in Ihrer Bigtable-Tabelle aggregieren, ohne dass Sie zum Aggregieren Ihrer Daten vor oder nach dem Schreiben in Bigtable ETL- oder Streamingverarbeitungssoftware verwenden müssen. Wenn Ihre Anwendung beispielsweise zuvor Nachrichten in Pub/Sub veröffentlicht und dann Dataflow verwendet hat, um die Nachrichten zu lesen und die Daten vor dem Schreiben in Bigtable zu aggregieren, können Sie die Daten stattdessen direkt an Aggregatzellen in Bigtable senden.

Aggregierte Spaltenfamilien

Wenn Sie aggregierte Zellen erstellen und aktualisieren möchten, muss die Tabelle mindestens eine zusammengefasste Spaltenfamilie enthalten. Das sind Spaltenfamilien, die nur aggregierte Zellen enthalten. Sie können sie beim Erstellen einer Tabelle erstellen oder einer bereits verwendeten Tabelle eine zusammengefasste Spaltenfamilie hinzufügen. Beim Erstellen der Spaltenfamilie geben Sie den Aggregationstyp an, z. B. Summe.

Eine Spaltenfamilie, die nicht aggregierte Daten enthält, kann nicht in eine zusammengefasste Spaltenfamilie konvertiert werden. Spalten in zusammengefassten Spaltenfamilien dürfen keine nicht aggregierten Zellen und Standardspaltenfamilien keine aggregierten Zellen enthalten.

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 für Summen unterstützte Eingabetyp ist Int64.

Zeitstempel

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

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

Eingabetyp

Der Eingabetyp des Werts in der Hinzufügungsanfrage muss mit dem Eingabetyp übereinstimmen, 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 eine AddToCell-Mutation in der Bigtable Data API. Im Gegensatz dazu sendet eine nicht aggregierte Schreibanfrage eine SetCell-Mutation. Weitere Informationen finden Sie in der Data API-Referenz. Für AddToCell-Vorgänge gelten dieselben Vorgangslimits wie für andere Tabellenmutationen.

In einer replizierten Tabelle konvergiert eine aggregierte Zelle innerhalb der aktuellen Replikationsverzögerung in allen Clustern zum gleichen Gesamtwert. Der Gesamtwert ist die Summe aller AddToCell-Mutationen, die seit dem letzten Löschvorgang oder seit Erstellung 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 Kennung für die Spalte
  • VALUE: der Wert, der in die Zelle eingefü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