Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:
Runtime 18.3 e superiores
Estende a JOIN com a classificação top-k numa expressão personalizada de distância ou similaridade. Para cada linha na consulta (esquerda) table_reference, encontra-se até linhas correspondentes no topo num_results da tabela de destino (direita) com base no ranking_expression, devolvendo-as como linhas concatenadas.
ranking_expression pode ser qualquer expressão escalar ordenável que marque um par de linhas das duas tabelas — por exemplo , vector_cosine_similarity, vector_l2_distance, vector_inner_product, ou uma expressão composta que combine várias funções.
Syntax
{ INNER | LEFT [ OUTER ] } JOIN target_table_reference
{ APPROX | EXACT } NEAREST [ num_results ]
BY { DISTANCE | SIMILARITY } ranking_expression
Parameters
-
A tabela de alvos para procurar. Pode ser uma tabela, subconsulta ou CTE.
{ INNER | LEFT [ OUTER ] }Optional. O tipo de junção. A predefinição é
INNER.-
INNERelimina linhas de consulta que não têm candidatos correspondentes. -
LEFT OUTERdevolve todas as linhas de consulta. Colunas do lado alvo sãoNULLquando não existem candidatos — por exemplo, quando a tabela alvo está vazia ou todos os candidatos sãoNULL. Se existirem menos candidatosnum_resultspara uma linha de consulta, apenas os candidatos disponíveis são devolvidos.
Outros tipos de junção (
RIGHT,FULL,SEMI,ANTI,CROSS, )NATURALelevamNEAREST_BY_JOIN.UNSUPPORTED_JOIN_TYPE.-
{ APPROX | EXACT }Controla o contrato do conjunto de resultados.
-
EXACTdevolve as linhas exatas do top-k sobranking_expression. -
APPROXdevolve um conjunto top-k que aproxima a classificação exata. O otimizador pode usar estratégias de pesquisa aproximadas mais rápidas em vez de avaliar todos os candidatos.
-
MAIS PRÓXIMO [ num_results ]
Literal inteiro positivo opcional. O valor padrão é
1. Deve estar dentro do intervalo[1, 100000]. Se a tabela alvo tiver menos linhas correspondentes do quenum_results, apenas as linhas disponíveis são devolvidas.Valores fora do intervalo aumentam
NEAREST_BY_JOIN.NUM_RESULTS_OUT_OF_RANGE.POR DISTÂNCIA | SEMELHANÇA
Define a ordem de
ranking_expression.-
DISTANCEordena as linhas pelo valor mais pequeno primeiro (mais próximo = distância mais baixa). -
SIMILARITYclassifica as linhas pelo maior valor em primeiro (mais próximo = maior similaridade).
-
ranking_expression
Uma expressão escalar que pode referenciar colunas de ambas as tabelas.
As escolhas mais comuns são:
- Funções de similaridade como vector_cosine_similarity e vector_inner_product,
- Funções de distância como vector_l2_distance,
- distâncias numéricas como a distância de Manhattan:
vector_norm(zip_with(a.col, b.col, (x, y) -> x - y), 1.0f).
Se esta expressão devolver um tipo de dado que não suporta ordenação, como
MAP, Azure Databricks eleva DATATYPE_MISMATCH. INVALID_ORDERING_TYPE.
Notes
Assimetria
NEAREST BY não é comutativo. O lado da consulta ancora o resultado — cada linha da consulta produz até linhas num_results de saída:
- Quando 100 linhas da mesa
usersse juntam com 1.000 linhas da tabelaproductscomNEAREST 5, a junção retorna até 500 linhas. - Se trocares os dois lados da junção para unir
productscomusers, devolve até 5.000 linhas.
Trocar os dois lados coloca uma questão diferente, pelo que o resultado difere mesmo para INNER JOIN.
Serviço de streaming
NEAREST BY não é suportado em DataFrames ou Conjuntos de Dados em streaming. Consultas contra fontes de streaming levantam NEAREST_BY_JOIN.STREAMING_NOT_SUPPORTED.
Embedding de entradas
Ao usar funções de pontuação vetorial, ambos os argumentos vetoriais devem ter ARRAY<FLOAT> a mesma dimensionalidade. Ver vector_cosine_similarity função para regras de tipo e NULL manuseamento.
Para calcular embeddings a partir de valores de cadeia, use ai_query com um modelo de embedding hospedado em Databricks, como databricks-gte-large-en.
Condições de erro comuns
- DATATYPE_MISMATCH. INVALID_ORDERING_TYPE
NEAREST_BY_JOIN.NUM_RESULTS_OUT_OF_RANGENEAREST_BY_JOIN.STREAMING_NOT_SUPPORTEDNEAREST_BY_JOIN.UNSUPPORTED_JOIN_TYPE
Examples
Os exemplos seguintes utilizam estas tabelas. Os embeddings são apresentados como vetores tridimensionais para brevidade; na prática, são de dimensão superior e calculadas por um modelo de imersão.
> 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