Kategorien:

Aggregatfunktionen (Häufigkeitsschätzung), Fensterfunktionen

APPROX_TOP_K_ACCUMULATE

Gibt am Ende der Aggregation den Space-Saving-Überblick zurück. (Weitere Informationen zum Space-Saving-Überblick finden Sie unter Schätzen häufiger Werte.)

Die Funktion APPROX_TOP_K verwirft ihren internen Zwischenstatus, sobald die endgültige Kardinalitätsschätzung zurückgegeben wird. In bestimmten fortgeschrittenen Anwendungsfällen, beispielsweise beim Schätzen inkrementeller Häufigkeitswerte beim Massenladen, möchten Sie den Zwischenstatus möglicherweise beibehalten. In diesem Fall würden Sie APPROX_TOP_K_ACCUMULATE anstelle von APPROX_TOP_K verwenden.

Anders als APPROX_TOP_K gibt APPROX_TOP_K_ACCUMULATE keine Häufigkeitsschätzung für Elemente zurück. Stattdessen wird der algorithmische Status selbst zurückgegeben. Der Zwischenstatus kann später lauten:

  • Kombiniert (d. h. zusammengeführt) mit Zwischenstatus aus separaten, aber verwandten Datenbatches.

  • Verarbeitet durch andere Funktionen, die direkt mit dem Zwischenstatus operieren, z. B. APPROX_TOP_K_ESTIMATE. (Ein Beispiel dazu finden Sie unten im Abschnitt „Beispiele“.)

  • Exportiert in externe Tools.

Siehe auch:

APPROX_TOP_K_COMBINE, APPROX_TOP_K_ESTIMATE

Syntax

APPROX_TOP_K_ACCUMULATE( <expr> , <counters> )
Copy

Argumente

expr

Der Ausdruck (z. B. Spaltenname), für den Sie die häufigsten Werte finden möchten.

counters

Dies ist die maximale Anzahl unterschiedlicher Werte, die sich beim Schätzen gleichzeitig verfolgen lassen.

Wenn counters beispielsweise auf „100000“ gesetzt ist, verfolgt der Algorithmus 100.000 verschiedene Werte und versucht, die 100.000 häufigsten Werte beizubehalten.

Die maximale Anzahl von counters beträgt 100000 (100.000).

Beispiele

In diesem Beispiel wird die Verwendung der drei verwandten Funktionen APPROX_TOP_K_ACCUMULATE, APPROX_TOP_K_ESTIMATE und APPROX_TOP_K_COMBINE veranschaulicht.

Bemerkung

In diesem Beispiel werden mehr Zähler als unterschiedliche Datenwerte verwendet, um konsistente Ergebnisse zu erhalten. In realen Anwendungen ist die Anzahl der diskreten Werte in der Regel größer als die Anzahl der Zähler, sodass Sie Näherungswerte erhalten, die variieren können.

In diesem Beispiel wird eine Tabelle mit 8 Zeilen und den Werten 1–8 sowie eine zweite Tabelle mit 8 Zeilen und den Werten 5–12 generiert. Daher sind die häufigsten Werte in der Vereinigung der beiden Tabellen die Werte 5 bis 8, von denen jeder eine Zählwert von 2 hat.

Erstellen Sie eine einfache Tabelle und Daten:

-- Create a sequence to use to generate values for the table.
CREATE OR REPLACE SEQUENCE seq91;
CREATE OR REPLACE TABLE sequence_demo (c1 INTEGER DEFAULT seq91.nextval, dummy SMALLINT);
INSERT INTO sequence_demo (dummy) VALUES (0);

-- Double the number of rows a few times, until there are 8 rows:
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
Copy

Erstellen Sie eine Tabelle, die den „Status“ enthält, der die aktuellen approximierten Informationen zu den K häufigsten Werten für die Tabelle namens sequence_demo darstellt:

CREATE OR REPLACE TABLE resultstate1 AS (
     SELECT approx_top_k_accumulate(c1, 50) AS rs1
        FROM sequence_demo);
Copy

Erstellen Sie nun eine zweite Tabelle, und fügen Sie Daten hinzu. (In einer realistischeren Situation hätte der Benutzer möglicherweise mehr Daten in die erste Tabelle geladen und die Daten anhand der Zeit, zu der die Daten geladen wurden, in nicht überlappende Sätze unterteilt.)

CREATE OR REPLACE TABLE test_table2 (c1 INTEGER);
-- Insert data.
INSERT INTO test_table2 (c1) SELECT c1 + 4 FROM sequence_demo;
Copy

Rufen Sie die „Statusinformationen“ nur für die neuen Daten ab.

CREATE OR REPLACE TABLE resultstate2 AS 
  (SELECT approx_top_k_accumulate(c1, 50) AS rs1 
     FROM test_table2);
Copy

Kombinieren Sie die „Statusinformationen“ für die zwei Mengen von Zeilen:

CREATE OR REPLACE TABLE combined_resultstate (c1) AS 
  SELECT approx_top_k_combine(rs1) AS apc1
    FROM (
        SELECT rs1 FROM resultstate1
        UNION ALL
        SELECT rs1 FROM resultstate2
      )
      ;
Copy

Ermitteln Sie den approximierten Top K-Wert der kombinierten Zeilenmenge:

SELECT approx_top_k_estimate(c1, 4) FROM combined_resultstate;
Copy

Ausgabe:

+------------------------------+
| APPROX_TOP_K_ESTIMATE(C1, 4) |
|------------------------------|
| [                            |
|   [                          |
|     5,                       |
|     2                        |
|   ],                         |
|   [                          |
|     6,                       |
|     2                        |
|   ],                         |
|   [                          |
|     7,                       |
|     2                        |
|   ],                         |
|   [                          |
|     8,                       |
|     2                        |
|   ]                          |
| ]                            |
+------------------------------+
Copy