MINHASH

MINHASH (유사도 추정)

입력 행들에 서로 다른 k개의 해시 함수를 적용하고 각 해시 함수의 최솟값을 유지함으로써 구성된 크기 k의 배열을 포함하는 MinHash 상태를 반환해요. 이 MinHash 상태는 APPROXIMATE_SIMILARITY 함수에 입력되어 하나 이상의 다른 MinHash 상태와의 유사도를 추정하는 데 사용될 수 있어요.

MinHash 상태에 대한 자세한 내용은 Estimating Similarity of Two or More Sets를 참고해요.

참조: MINHASH_COMBINE

출처: Snowflake SQL Reference - MINHASH

본문

구문

집계 함수

MINHASH( <k>, [ DISTINCT ] expr+ )

MINHASH( <k>, * )

윈도우 함수

MINHASH( <k>, [ DISTINCT ] expr+ ) OVER ( [ PARTITION BY <expr1> ] )

MINHASH( <k>, * ) OVER ( [ PARTITION BY <expr1> ] )

OVER 절에 대한 자세한 내용은 Window function syntax and usage를 참고해요.

인자

k

만들 해시 함수의 수예요. 값이 클수록 근사가 더 좋지만, 이 값은 APPROXIMATE_SIMILARITY를 사용한 유사도 추정 계산 시간에 선형적인 영향을 미쳐요. 권장 값은 100이에요. 최대값은 1024예요.

expr

해시할 값을 결정하는 하나 이상의 표현식(일반적으로 열 이름)이에요.

*

입력 행의 모든 열을 해시해요.

사용상 주의사항

  • 이 함수는 집계 함수 또는 윈도우 함수로 사용할 수 있어요.
  • DISTINCT는 인자로 포함될 수 있지만 효과는 없어요.

예시

USE SCHEMA snowflake_sample_data.tpch_sf1;

SELECT MINHASH(5, *) FROM orders;
+----------------------+
| MINHASH(5, *)        |
|----------------------|
| {                    |
|   "state": [         |
|     78678383574307,  |
|     586952033158539, |
|     525995912623966, |
|     508991839383217, |
|     492677003405678  |
|   ],                 |
|   "type": "minhash", |
|   "version": 1       |
| }                    |
+----------------------+

여기 세 개의 관련 함수 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 INTO ta (i) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
INSERT INTO tb (i) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (11);
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 함수 시연:

CREATE TABLE minhash_a_2 (mh) AS SELECT MINHASH(100, i) FROM ta WHERE i > 10;

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

더 알아보기