Beispiele - Amazon Redshift

Amazon Redshift wird UDFs ab dem 1. November 2025 die Erstellung von neuem Python nicht mehr unterstützen. Wenn Sie Python verwenden möchten UDFs, erstellen Sie das UDFs vor diesem Datum liegende. Bestehendes Python UDFs wird weiterhin wie gewohnt funktionieren. Weitere Informationen finden Sie im Blog-Posting.

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Beispiele

Dieser Abschnitt enthält Beispiele für die Verwendung von HyperLogLog mit Amazon Redshift.

Beispiel: Rückgabe der Kardinalität in einer Unterabfrage

Im folgenden Beispiel wird die Kardinalität für jede Skizze in einer Unterabfrage für eine Tabelle mit dem Namen Sales (Vertrieb) zurückgegeben.

CREATE TABLE Sales (customer VARCHAR, country VARCHAR, amount BIGINT); INSERT INTO Sales VALUES ('David Joe', 'Greece', 14.5), ('David Joe', 'Greece', 19.95), ('John Doe', 'USA', 29.95), ('John Doe', 'USA', 19.95), ('George Spanos', 'Greece', 9.95), ('George Spanos', 'Greece', 2.95);

Die folgende Abfrage generiert eine HLL-Skizze für die Kunden jedes Landes und extrahiert die Kardinalität. So werden die eindeutigen Kunden aus jedem Land angezeigt.

SELECT hll_cardinality(sketch), country FROM (SELECT hll_create_sketch(customer) AS sketch, country FROM Sales GROUP BY country) AS hll_subquery; hll_cardinality | country ----------------+--------- 1 | USA 2 | Greece ...

Beispiel: Rückgabe eines HLLSKETCH-Typs von kombinierten Skizzen in einer Unterabfrage

Im folgenden Beispiel wird ein einzelner HLLSKETCH-Typ zurückgegeben, der die Kombination einzelner Skizzen aus einer Unterabfrage darstellt. Die Skizzen werden mit der Aggregationsfunktion HLL_COMBINE kombiniert.

SELECT hll_combine(sketch) FROM (SELECT hll_create_sketch(customer) AS sketch FROM Sales GROUP BY country) AS hll_subquery hll_combine -------------------------------------------------------------------------------------------- {"version":1,"logm":15,"sparse":{"indices":[29808639,35021072,47612452],"values":[1,1,1]}} (1 row)

Beispiel: Rückgabe einer HyperLogLog-Skizze von der Kombination mehrerer Skizzen

Im folgenden Beispiel nehmen wir an, dass die Tabelle page-users die voraggregierten Skizzen für jede Seite speichert, die Benutzer auf einer bestimmten Website besucht haben. Jede Zeile in dieser Tabelle enthält eine HyperLogLog-Skizze, die alle Benutzer-IDs darstellt, die die besuchten Seiten anzeigen.

page_users -- +----------------+-------------+--------------+ -- | _PARTITIONTIME | page | sketch | -- +----------------+-------------+--------------+ -- | 2019-07-28 | homepage | CHAQkAQYA... | -- | 2019-07-28 | Product A | CHAQxPnYB... | -- +----------------+-------------+--------------+

Im folgenden Beispiel werden die voraggregierten Skizzen zu einer einzelnen Skizze zusammengefasst. Diese Skizze kapselt die kollektive Kardinalität, die jede Skizze kapselt.

SELECT hll_combine(sketch) as sketch FROM page_users

Die Ausgabe sieht folgendermaßen oder ähnlich aus.

-- +-----------------------------------------+ -- | sketch | -- +-----------------------------------------+ -- | CHAQ3sGoCxgCIAuCB4iAIBgTIBgqgIAgAwY.... | -- +-----------------------------------------+

Wenn eine neue Skizze erstellt wird, können Sie die Funktion HLL_CARDINALITY verwenden, um die kollektiven eindeutigen Werte abzurufen, wie im Folgenden gezeigt.

SELECT hll_cardinality(sketch) FROM ( SELECT hll_combine(sketch) as sketch FROM page_users ) AS hll_subquery

Die Ausgabe sieht folgendermaßen oder ähnlich aus.

-- +-------+ -- | count | -- +-------+ -- | 54356 | -- +-------+

Beispiel: Generieren von HyperLogLog-Skizzen über S3-Daten mit externen Tabellen

In den folgenden Beispielen werden HyperLogLog-Skizzen zwischengespeichert, um den direkten Zugriff auf Amazon S3 zur Kardinalitätsschätzung zu vermeiden.

Sie können HyperLogLog-Skizzen in externen Tabellen, die für die Speicherung von Amazon-S3-Daten definiert wurden, voraggregieren und zwischenspeichern. Auf diese Weise können Sie Kardinalitätsschätzungen extrahieren, ohne auf die zugrundeliegenden Basisdaten zuzugreifen.

Angenommen, Sie haben eine Reihe von Textdateien mit Tabulatortrennzeichen in Amazon S3 entladen. Sie führen die folgende Abfrage aus, um eine externe Tabelle mit Namen sales im externen Amazon-Redshift-Schema mit dem Namen spectrum zu definieren. Für dieses Beispiel befindet sich der S3-Bucket in der Region USA Ost (Nord-Virginia) AWS-Region.

create external table spectrum.sales( salesid integer, listid integer, sellerid smallint, buyerid smallint, eventid integer, dateid integer, qtysold integer, pricepaid decimal(8,2), commission decimal(8,2), saletime timestamp) row format delimited fields terminated by '\t' stored as textfile location 's3://redshift-downloads/tickit/spectrum/sales/';

Angenommen, Sie möchten die einzelnen Käufer berechnen, die einen Artikel zu einem beliebigen Datum gekauft haben. Dazu werden im folgenden Beispiel Skizzen für die Käufer-IDs für jeden Tag des Jahres generiert und das Ergebnis wird in der Amazon-Redshift-Tabelle gespeichert hll_sales.

CREATE TABLE hll_sales AS SELECT saletime, hll_create_sketch(buyerid) AS sketch FROM spectrum.sales GROUP BY saletime; SELECT TOP 5 * FROM hll_sales;

Die Ausgabe sieht folgendermaßen oder ähnlich aus.

-- hll_sales -- | saletime | sketch | -- +-----------------+---------------------------------------------------------------------+ -- | 7/22/2008 8:30 | {"version":1,"logm":15,"sparse":{"indices":[9281416],"values":[1]}} -- | 2/19/2008 0:38 | {"version":1,"logm":15,"sparse":{"indices":[48735497],"values":[3]}} -- | 11/5/2008 4:49 | {"version":1,"logm":15,"sparse":{"indices":[27858661],"values":[1]}} -- | 10/27/2008 4:08 | {"version":1,"logm":15,"sparse":{"indices":[65295430],"values":[2]}} -- | 2/16/2008 9:37 | {"version":1,"logm":15,"sparse":{"indices":[56869618],"values":[2]}} -- +---------------- +---------------------------------------------------------------------+

Die folgende Abfrage extrahiert die geschätzte Anzahl verschiedener Käufer, die am Black Friday 2008 einen Artikel gekauft haben.

SELECT hll_cardinality(hll_combine(sketch)) as distinct_buyers FROM hll_sales WHERE trunc(saletime) = '2008-11-28';

Die Ausgabe sieht folgendermaßen oder ähnlich aus.

distinct_buyers --------------- 386

Angenommen, Sie möchten die Anzahl der eindeutigen Benutzer, die einen Artikel an einem bestimmten Datumsbereich gekauft haben abrufen. Der Zeitraum könnte sich zum Beispiel vom Black Friday bis zum darauffolgenden Montag erstrecken. Um diese Information abzurufen, verwendet die folgende Abfrage die Aggregationsfunktion hll_combine. Mit dieser Funktion können Sie vermeiden, dass Käufer doppelt gezählt werden, die einen Artikel an mehr als einem Tag des ausgewählten Bereichs gekauft haben.

SELECT hll_cardinality(hll_combine(sketch)) as distinct_buyers FROM hll_sales WHERE saletime BETWEEN '2008-11-28' AND '2008-12-01';

Die Ausgabe sieht folgendermaßen oder ähnlich aus.

distinct_buyers --------------- 1166

Damit die Tabelle hll_sales aktuell bleibt, muss die folgende Abfrage am Ende jedes Tages ausgeführt werden. Auf diese Weise wird eine HyperLogLog-Skizze generiert, die auf den IDs der Käufer basiert, die heute einen Artikel gekauft haben, und der hll_sales-Tabelle hinzugefügt.

INSERT INTO hll_sales SELECT saletime, hll_create_sketch(buyerid) FROM spectrum.sales WHERE TRUNC(saletime) = to_char(GETDATE(), 'YYYY-MM-DD') GROUP BY saletime;