적용 대상:yes Databricks Runtime 18.3 이상으로 ![]()
JOIN 사용자 지정 거리 또는 유사성 식에서 상위 K 순위로 확장합니다. 쿼리(왼쪽) table_reference 각 행에 대해 대상(오른쪽) 테이블ranking_expression의 상위 num_results 행을 찾아 연결된 행으로 반환합니다.
ranking_expression는 두 테이블의 행 쌍(예: vector_cosine_similarity, vector_l2_distance, vector_inner_product 또는 여러 함수를 결합하는 복합 식)의 점수를 지정하는 정렬 가능한 스칼라 식일 수 있습니다.
Syntax
{ INNER | LEFT [ OUTER ] } JOIN target_table_reference
{ APPROX | EXACT } NEAREST [ num_results ]
BY { DISTANCE | SIMILARITY } ranking_expression
Parameters
-
검색할 대상 테이블입니다. 테이블, 하위 쿼리 또는 CTE일 수 있습니다.
{ INNER | LEFT [ OUTER ] }Optional. 조인 유형입니다. 기본값은
INNER입니다.-
INNER는 일치하는 후보가 없는 쿼리 행을 삭제합니다. -
LEFT OUTER는 모든 쿼리 행을 반환합니다. 대상 쪽 열은NULL후보(예: 대상 테이블이 비어 있거나 모든 후보가 있는 경우)가 없는 경우입니다NULL. 쿼리 행에 대한 후보보다num_results적은 수의 후보가 있는 경우 사용 가능한 후보만 반환됩니다.
다른 조인 형식(
RIGHT, ,FULLSEMI,ANTI,NATURALCROSS)은 발생NEAREST_BY_JOIN.UNSUPPORTED_JOIN_TYPE합니다.-
{ APPROX | EXACT }결과 집합 계약을 제어합니다.
-
EXACT에서 정확한 상위 K 행을 반환합니다ranking_expression. -
APPROX는 정확한 순위를 근사값으로 하는 top-k 집합을 반환합니다. 최적화 프로그램은 모든 후보를 평가하는 대신 더 빠르고 대략적인 검색 전략을 사용할 수 있습니다.
-
NEAREST [ num_results ]
선택적 양의 정수 리터럴입니다. 기본값은
1입니다. 범위에[1, 100000]있어야 합니다. 대상 테이블에 일치하는 행 수가 더num_results적은 경우 사용 가능한 행만 반환됩니다.범위를 벗어난 값은 발생합니다
NEAREST_BY_JOIN.NUM_RESULTS_OUT_OF_RANGE.BY DISTANCE | 유사성
의 순서를
ranking_expression설정합니다.-
DISTANCE행을 가장 작은 값으로 우선 순위 지정합니다(가장 가까운 값 = 가장 낮은 거리). -
SIMILARITY행을 가장 큰 값으로 우선 순위 지정합니다(가장 가까운 값 = 가장 높은 유사성).
-
ranking_expression
두 테이블의 열을 참조할 수 있는 스칼라 식입니다.
일반적인 선택은 다음과 같습니다.
- vector_cosine_similarity 및vector_inner_product 같은 유사성 함수
- vector_l2_distance 같은 거리 함수,
- 맨해튼 거리와 같은 숫자 거리:
vector_norm(zip_with(a.col, b.col, (x, y) -> x - y), 1.0f).
이 식이 정렬을 지원하지 않는 데이터 형식(예:
MAP)을 반환하는 경우 Azure Databricks DATATYPE_MISMATCH 발생합니다. INVALID_ORDERING_TYPE.
Notes
비대칭
NEAREST BY 가 정류되지 않습니다. 쿼리 쪽은 결과를 고정합니다. 각 쿼리 행은 최대 출력 행을 num_results 생성합니다.
- 테이블의 행 100개와 테이블
usersproducts의 행 1,000개에NEAREST 5조인하면 조인은 최대 500개의 행을 반환합니다. - 조인의 양쪽을 조
products인으로users전환하면 최대 5,000개의 행이 반환됩니다.
양측을 교환하는 것은 다른 질문을 하므로 결과가 다릅니다 INNER JOIN.
Streaming
NEAREST BY 는 스트리밍 데이터 프레임 또는 데이터 세트에서 지원되지 않습니다. 스트리밍 원본에 대한 쿼리는 발생 NEAREST_BY_JOIN.STREAMING_NOT_SUPPORTED합니다.
입력 포함
벡터 채점 함수를 사용하는 경우 두 벡터 인수 모두 동일한 차원을 사용해야 합니다 ARRAY<FLOAT> . 형식 및 NULL 처리 규칙에 대한 함수를 참조하세요vector_cosine_similarity.
문자열 값에서 포함을 계산하려면 Databricks 호스팅 포함 모델(예: databricks-gte-large-en)과 함께 ai_query 사용합니다.
일반적인 오류 조건
- DATATYPE_MISMATCH. INVALID_ORDERING_TYPE
NEAREST_BY_JOIN.NUM_RESULTS_OUT_OF_RANGENEAREST_BY_JOIN.STREAMING_NOT_SUPPORTEDNEAREST_BY_JOIN.UNSUPPORTED_JOIN_TYPE
예제
다음 예제에서는 이러한 테이블을 사용합니다. 포함은 간결성을 위해 3차원 벡터로 표시됩니다. 실제로는 더 높은 차원이며 포함 모델에 의해 계산됩니다.
> CREATE TEMP VIEW users(user_id, name, embedding) AS
VALUES
(1, 'Alice', ARRAY(1.0f, 0.0f, 0.0f)),
(2, 'Bob', ARRAY(0.0f, 1.0f, 0.0f)),
(3, 'Carol', ARRAY(0.0f, 0.0f, 0.0f));
> CREATE TEMP VIEW products(product_id, name, price, country, embedding) AS
VALUES
('P1', 'Trail running shoes', 120, 'EU', ARRAY(0.9f, 0.1f, 0.1f)),
('P2', 'Hiking boots', 180, 'EU', ARRAY(0.8f, 0.2f, 0.0f)),
('P3', 'Office shoes', 95, 'US', ARRAY(0.1f, 0.9f, 0.1f)),
('P4', 'Sandals', 45, 'US', ARRAY(0.0f, 0.8f, 0.2f)),
('P5', 'Running shoes', 110, 'EU', ARRAY(0.5f, 0.5f, 0.0f));
-- Ad-hoc vector search with an explicit query vector.
> SELECT t.product_id, t.name
FROM (SELECT ARRAY(1.0f, 0.0f, 0.0f) AS embedding) q
INNER JOIN products t
APPROX NEAREST 3 BY SIMILARITY vector_cosine_similarity(q.embedding, t.embedding);
product_id name
---------- -------------------
P1 Trail running shoes
P2 Hiking boots
P5 Running shoes
-- Batch recommendations: for every user, return the 2 nearest products.
> SELECT q.user_id, q.name, t.product_id, t.name AS product
FROM users q
INNER JOIN products t
APPROX NEAREST 2 BY SIMILARITY vector_cosine_similarity(q.embedding, t.embedding);
user_id name product_id product
------- ----- ---------- -------------------
1 Alice P1 Trail running shoes
1 Alice P2 Hiking boots
2 Bob P3 Office shoes
2 Bob P4 Sandals
-- Pre-filter the target table via a subquery (EU products only).
> SELECT q.user_id, q.name, t.product_id, t.name AS product, t.price
FROM users q
INNER JOIN (SELECT * FROM products WHERE country = 'EU') AS t
APPROX NEAREST 2 BY SIMILARITY vector_cosine_similarity(q.embedding, t.embedding);
user_id name product_id product price
------- ----- ---------- ------------------- -----
1 Alice P1 Trail running shoes 120
1 Alice P2 Hiking boots 180
2 Bob P5 Running shoes 110
2 Bob P2 Hiking boots 180
-- LEFT OUTER returns every query row. Carol's embedding has zero magnitude,
-- so vector_cosine_similarity returns NULL for all comparisons and her row
-- is preserved with NULL target columns.
> SELECT q.user_id, q.name, t.product_id, t.name AS product
FROM users q
LEFT OUTER JOIN products t
APPROX NEAREST 2 BY SIMILARITY vector_cosine_similarity(q.embedding, t.embedding);
user_id name product_id product
------- ----- ---------- -------------------
1 Alice P1 Trail running shoes
1 Alice P2 Hiking boots
2 Bob P3 Office shoes
2 Bob P4 Sandals
3 Carol NULL NULL
-- EXACT returns the exact top-k under the ranking expression.
> SELECT t.product_id, t.name
FROM (SELECT ARRAY(1.0f, 0.0f, 0.0f) AS embedding) q
INNER JOIN products t
EXACT NEAREST 3 BY DISTANCE vector_l2_distance(q.embedding, t.embedding);
product_id name
---------- -------------------
P1 Trail running shoes
P2 Hiking boots
P5 Running shoes