NEAREST BY 절

적용 대상: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

  • target_table_reference

    검색할 대상 테이블입니다. 테이블, 하위 쿼리 또는 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 사용합니다.

일반적인 오류 조건

예제

다음 예제에서는 이러한 테이블을 사용합니다. 포함은 간결성을 위해 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