Examples - Amazon Redshift
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Examples

示例:在子查询中返回基数

以下示例返回了名为的表子查询中每个草图的基数。 销售.

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);

以下查询会为每个国家的客户生成HLL草图,并提取基数。这显示了来自每个国家/地区的独特客户。

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 ...

示例:从子查询中的组合草图返回HLLSKETCH类型

以下示例返回单个HLLSKETCH类型,表示子查询中各个草图的组合。通过使用HLL_COMBINE聚合函数组合草图。

SELECT hll_combine(sketch) FROM (SELECT hll_create_sketch(customers) 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)

示例:返回a HyperLogLog 组合多个草图的草图

对于以下示例,假设该表 page-users 存储用户在给定网站上访问的每个页面的预聚合草图。此表中的每一行包含 HyperLogLog 代表所有用户的草图 IDs 显示访问的页面。

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

以下示例结合预聚合的多个草图并生成单个草图。此草图封装了每个草图封装的集体基数。

SELECT hll_combine(sketch) as sketch FROM page_users

该输出值看上去类似以下内容。

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

创建新草图时,您可以使用HLL_CARDINALITY功能获取集合的不同值,如下所示。

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

该输出值看上去类似以下内容。

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

示例:缓存 HyperLogLog 基数估算草图

以下示例缓存 HyperLogLog 草图以避免直接访问 Amazon S3 基数估计。

您可以预先聚合和缓存 HyperLogLog 定义用来保存的外部表中的草图 Amazon S3 数据。通过此操作,您可以提取基数估计值而不访问基础数据。

例如,假设您已将一组由选项卡分隔的文本文件卸载到 Amazon S3. 运行以下查询以定义名为的外部表 sales 在 Amazon Redshift 外部框架已命名 spectrum.

create external table spectrum.sales( sellerid integer, buyerid integer, dateid smallint, qtysold smallint, product_type integer, pricepaid decimal(8,2), commission decimal(8,2), saletime date) row format delimited fields terminated by '\t'stored as textfile location 's3://awssampledbuswest2/tickit/spectrum/sales/';

假设您想计算任意日期购买商品的不同买家。为此,以下示例为买方生成草图 IDs 并将结果存储在 Amazon Redshift 表 hll_sales.

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

该输出值看上去类似以下内容。

-- hll_sales -- | saletime | sketch | -- +----------------+---------------+ -- | 2018-11-23 | "CHAQkAQYA..." -- | 2018-11-24 | "TNLMLMLKK..." -- | 2018-11-25 | "KMNKLLOKM..." -- | 2018-11-26 | "MMKNKLLMO..." -- | 2018-11-27 | "MMLSKNLPM..." -- +----------------+---------------+

以下查询提取感恩节之后周五购买商品的估计不同买家数量。

SELECT hll_cardinality(sketch) as distinct_buyers FROM hll_sales WHERE saletime = '2018-11-23';

该输出值看上去类似以下内容。

distinct_buyers --------------- 1771

假设您希望在特定日期范围内购买商品的不同用户数量。例如,从感恩节之后的星期五到下个星期一。要获取此信息,以下查询使用 hll_combine 聚合函数。此功能使您可以避免对在选定范围超过一天内购买商品的买家进行重复盘点。

SELECT hll_cardinality(hll_combine(sketch)) as distinct_buyers FROM hll_sales WHERE saletime BETWEEN '2018-11-23' AND '2018-11-26';

该输出值看上去类似以下内容。

distinct_buyers --------------- 232152

为保持 hll_sales 表中的最新状态,在每天结束时运行以下查询。这样做会产生 HyperLogLog 基于 IDs 的购买者 hll_sales 表。

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