- 类别:
/sql-reference/functions-aggregation`(相似度估算)、:doc:/sql-reference/functions-analytic`
APPROXIMATE_SIMILARITY¶
根据输入的 MinHash 状态返回其相似度(Jaccard 指数)的估计值。有关 MinHash 状态的更多信息,请参阅 估计两个或多个集合的相似度。
语法¶
APPROXIMATE_SIMILARITY( [ DISTINCT ] <expr> [ , ... ] )
APPROXIMATE_SIMILARITY(*)
实参¶
expr
表达式应该是 MINHASH 函数调用返回的一个或多个 MinHash 状态。换言之,表达式必须是
MinHash
状态信息,而不是您需要其近似相似度的列或表达式。(下面的示例有助于说明这一点。)有关 MinHash 状态的更多信息,请参阅 估计两个或多个集合的相似度。
返回¶
介于 0.0 和 1.0(含)之间的浮点数,其中 1.0 表示集相同,0.0 表示集没有重叠。
使用说明¶
DISTINCT
可以作为实参包含在内,但不起作用。输入 MinHash 状态必须具有长度相等的 MinHash 数组。
输入 MinHash 状态的数组长度是近似值的质量指标。
函数 MINHASH 中使用的
k
的值越大,近似值就越准确。但是,此值对相似度估算的计算时间具有线性影响。
示例¶
USE SCHEMA snowflake_sample_data.tpch_sf1;
SELECT APPROXIMATE_SIMILARITY(mh) FROM
(
(SELECT MINHASH(100, C5) mh FROM orders WHERE c2 <= 50000)
UNION
(SELECT MINHASH(100, C5) mh FROM orders WHERE C2 > 50000)
);
+----------------------------+
| APPROXIMATE_SIMILARITY(MH) |
|----------------------------|
| 0.97 |
+----------------------------+
此处是更广泛的示例,显示了三个相关的函数 MINHASH
、MINHASH_COMBINE
和 APPROXIMATE_SIMILARITY
。此示例创建 3 个表(ta、tb 和 tc),其中两个表(ta 和 tb)相似,两个表(ta 和 tc)完全不同。
创建并使用以下值填充表:
CREATE TABLE ta (i INTEGER); CREATE TABLE tb (i INTEGER); CREATE TABLE tc (i INTEGER); -- Insert values into the 3 tables. INSERT INTO ta (i) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10); -- Almost the same as the preceding values. INSERT INTO tb (i) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (11); -- Different values and different number of values. INSERT INTO tc (i) VALUES (-1), (-20), (-300), (-4000);计算初始数据集的 minhash 信息:
CREATE TABLE minhash_a_1 (mh) AS SELECT MINHASH(100, i) FROM ta; CREATE TABLE minhash_b (mh) AS SELECT MINHASH(100, i) FROM tb; CREATE TABLE minhash_c (mh) AS SELECT MINHASH(100, i) FROM tc;向其中一个表添加更多数据:
INSERT INTO ta (i) VALUES (12);演示
MINHASH_COMBINE
函数:-- Record minhash information about only the new rows: CREATE TABLE minhash_a_2 (mh) AS SELECT MINHASH(100, i) FROM ta WHERE i > 10; -- Now combine all the minhash info for the old and new rows in table ta. CREATE TABLE minhash_a (mh) AS SELECT MINHASH_COMBINE(mh) FROM ( (SELECT mh FROM minhash_a_1) UNION ALL (SELECT mh FROM minhash_a_2) );此查询显示两个相似表(ta 和 tb)的近似相似度:
SELECT APPROXIMATE_SIMILARITY (mh) FROM ( (SELECT mh FROM minhash_a) UNION ALL (SELECT mh FROM minhash_b) ); +-----------------------------+ | APPROXIMATE_SIMILARITY (MH) | |-----------------------------| | 0.75 | +-----------------------------+此查询显示两个截然不同的表(ta 和 tc)的近似相似度:
SELECT APPROXIMATE_SIMILARITY (mh) FROM ( (SELECT mh FROM minhash_a) UNION ALL (SELECT mh FROM minhash_c) ); +-----------------------------+ | APPROXIMATE_SIMILARITY (MH) | |-----------------------------| | 0 | +-----------------------------+