APPROX_TOP_K_ACCUMULATE¶
在聚合结束时返回 Space-Saving 的摘要。(有关 Space-Saving 摘要的详细信息,请参阅 估计频次值。)
功能 APPROX_TOP_K 在返回最终基数估计值时,会丢弃其内部的中间状态。但是,在某些高级用例中,例如在批量加载期间估计增量频繁值,您可能希望保留中间状态,在这种情况下,您可以使用 APPROX_TOP_K_ACCUMULATE
代替 APPROX_TOP_K。
与 APPROX_TOP_K 不同,APPROX_TOP_K_ACCUMULATE 不返回项目的频率估算值。相反,它返回的是算法状态本身。中间状态稍后可为:
与来自独立但相关的数据批次的中间状态相结合(即合并)。
由直接作用于中间状态的其他函数处理,例如 APPROX_TOP_K_ESTIMATE。(有关示例,请参阅下面的“示例”部分。)
导出到外部工具。
语法¶
APPROX_TOP_K_ACCUMULATE( <expr> , <counters> )
实参¶
expr
您想要查找最常见值的表达式(例如列名称)。
counters
这是在估算过程中一次可以跟踪的非重复值数量上限。
例如,如果
counters
设置为 100000,则算法将跟踪 100000 个不同值,尝试保留 100000 个比较频繁的值。counters
的数量上限是100000
(100000)。
示例¶
此示例说明如何使用三个相关函数 APPROX_TOP_K_ACCUMULATE
、APPROX_TOP_K_ESTIMATE
和 APPROX_TOP_K_COMBINE
。
备注
此示例使用比不同数据值更多的计数器,以便获得一致的结果。在实际应用中,非重复值的数量通常大于计数器的数量,因此近似值可能会有所不同。
此示例生成一个表,其中包含值为 1-8 的 8 行,以及另一个包含 8 行的表,其值为 5-12。因此,两个表的并集中比较常见的值是值 5-8,每个值的计数为 2。
创建简单的表和数据:
-- 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;创建一个包含“状态”的表,该“状态”表示名为 sequence_demo 的表的当前近似 Top K 信息:
CREATE OR REPLACE TABLE resultstate1 AS ( SELECT approx_top_k_accumulate(c1, 50) AS rs1 FROM sequence_demo);现在创建另一个表并添加数据。 (在更实际的情况下,用户可以将更多数据加载到第一个表中,并根据加载数据的时间将数据划分为非重叠集)。
CREATE OR REPLACE TABLE test_table2 (c1 INTEGER); -- Insert data. INSERT INTO test_table2 (c1) SELECT c1 + 4 FROM sequence_demo;仅获取新数据的“状态”信息。
CREATE OR REPLACE TABLE resultstate2 AS (SELECT approx_top_k_accumulate(c1, 50) AS rs1 FROM test_table2);合并两批行的“状态”信息:
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 ) ;获取组合行集的近似 Top K 值:
SELECT approx_top_k_estimate(c1, 4) FROM combined_resultstate;输出:
+------------------------------+ | APPROX_TOP_K_ESTIMATE(C1, 4) | |------------------------------| | [ | | [ | | 5, | | 2 | | ], | | [ | | 6, | | 2 | | ], | | [ | | 7, | | 2 | | ], | | [ | | 8, | | 2 | | ] | | ] | +------------------------------+