Предложение NEAREST BY

Область применения:check помечена да Databricks Runtime 18 LTS и выше

Note

Databricks Runtime 18 является более новым, чем Databricks Runtime 18.0, 18.1 и 18.2. Функции, которые ранее были отправлены в качестве более поздней нумеровой версии, теперь отправляются как устаревшие обновления в Databricks Runtime 18. Дополнительные сведения см. в разделе "Сведения об унифицированных заметках о выпуске".

JOIN Расширяет рейтинг топ-k на пользовательском расстоянии или выражении сходства. Для каждой строки в запросе (слева) table_reference он находит до верхней совпадающей num_results строки из целевой (правой) таблицы на ranking_expressionоснове, возвращая их как объединенные строки.

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, , FULLSEMIANTI, CROSS, ) NATURALвызываютNEAREST_BY_JOIN.UNSUPPORTED_JOIN_TYPE.

  • { APPROX | EXACT }

    Управляет контрактом результирующих наборов.

    • EXACT возвращает точные строки top-k в разделе ranking_expression.
    • APPROX возвращает набор top-k, который приблизит точный рейтинг. Оптимизатор может использовать более быстрые, приблизительные стратегии поиска вместо оценки каждого кандидата.
  • БЛИЖАЙШЕЕ [ num_results ]

    Необязательный положительный целый литерал. По умолчанию — 1. Должен находиться в диапазоне [1, 100000]. Если целевая таблица имеет меньше совпадающих строк, чем num_results, возвращаются только доступные строки.

    Значения за пределами диапазона вызываются NEAREST_BY_JOIN.NUM_RESULTS_OUT_OF_RANGE.

  • ПО РАССТОЯНИЮ | СХОДСТВО

    Задает порядок 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.

Примечания.

Асимметрия

NEAREST BY не является коммутативным. Сторона запроса привязает результат. Каждая строка запроса создает до num_results выходных строк:

  • Если 100 строк из соединения таблицы с 1000 строками из таблицы usersproducts , NEAREST 5соединение возвращает до 500 строк.
  • При переключении двух сторон соединения на присоединение productsusersк нему возвращается до 5000 строк.

Переключение двух сторон задает другой вопрос, поэтому результат отличается даже для INNER JOIN.

Стриминг

NEAREST BY не поддерживается в потоковых кадрах данных или наборах данных. Запросы к источникам потоковой передачи вызываются NEAREST_BY_JOIN.STREAMING_NOT_SUPPORTED.

Внедрение входных данных

При использовании функций оценки векторов оба вектора должны иметь ARRAY<FLOAT> одинаковую размерность. См. vector_cosine_similarity функцию для правил типа и NULL обработки.

Чтобы вычислить внедрение из строковых значений, используйте ai_query с моделью внедрения, размещенной в Databricks, например databricks-gte-large-en.

Распространенные условия ошибки

Примеры

В следующих примерах используются эти таблицы. Векторы внедрения отображаются как трехмерные векторы для краткости; на практике они являются более высокими размерными и вычисляются моделью внедрения.

> 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