Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения:
проверка Databricks SQL
Databricks Runtime 19.0 и выше
Important
Эта функция доступна в бета-версии. Администраторы рабочей области могут управлять доступом к этой функции на странице "Предварительные версии ". См. статью "Управление предварительными версиями Azure Databricks".
Находит и фильтрует шаблоны в строках предыдущей table_reference.
MATCH_RECOGNIZE секционирует входные данные, упорядочивает строки в каждой секции, сопоставляет шаблон строки с упорядоченной последовательностью и возвращает сводку или результаты для каждой строки в зависимости от режима сопоставления строк.
Типичные варианты использования включают обнаружение последовательных значений, движения цен на фигуру V или W-фигуры и потоки событий сеансизации.
Syntax
MATCH_RECOGNIZE (
[ PARTITION BY partition [, ...] ]
[ ORDER BY order_by ]
[ MEASURES measures ]
[ row_pattern_rows_per_match ]
[ AFTER MATCH row_pattern_skip_to ]
PATTERN ( row_pattern )
DEFINE row_pattern_definition_list )
measures
MEASURES { measureExpr AS measureName } [, ...]
row_pattern_rows_per_match
{ ONE ROW PER MATCH
| ALL ROWS PER MATCH [ SHOW EMPTY MATCHES ] }
row_pattern_skip_to
SKIP PAST LAST ROW
Parameters
PARTITION Раздел BY [, ...]
Одно или несколько выражений, определяющих группы строк, на которых выполняется сопоставление шаблонов. Если не указано
PARTITION BY, раздел содержит все строки.PARTITION BYпринимает только ссылки на столбцы. Если указать другое выражение, Azure Databricks вызывает MATCH_RECOGNIZE_PARTITION_BY_MUST_BE_COLUMN.ORDER BY order_by
Указывает порядок строк в каждой секции. Функции сопоставления шаблонов и навигации используют этот порядок.
-
При необходимости определяет столбцы мер, возвращаемые для каждого соответствия шаблона.
row_pattern_rows_per_match
Определяет, сколько строк возвращается на совпадение. Значение по умолчанию —
ONE ROW PER MATCH.ONE ROW PER MATCHВозвращает одну строку на совпадение. Результат содержит только столбцы секций и столбцы мер.
ALL ROWS PER MATCH [ SHOW EMPTY MATCHES ]Возвращает одну строку для каждой строки, которая участвует в совпадении. Каждая выходная строка включает соответствующие входные столбцы из
table_referenceстолбцов,PARTITION BYстолбцов иMEASURESстолбцов, вычисляемых для этого соответствия.SHOW EMPTY MATCHESпринимается в разделеALL ROWS PER MATCHи по умолчанию используется, если не указана вложенная обработка пустого совпадения. Этот выпуск не создает пустые совпадения, поэтому ключевое слово не влияет на результат.
ПОСЛЕ ROW_PATTERN_SKIP_TO MATCH
Указывает, какая строка будет продолжаться после обнаружения совпадения. Этот выпуск поддерживает
SKIP PAST LAST ROWтолько. Перейдите к строке сразу после последней строки текущего совпадения. Это значение по умолчанию при опущенииAFTER MATCHпредложения.PATTERN ( row_pattern )
Указывает шаблон, соответствующий.
ОПРЕДЕЛЕНИЕ row_pattern_definition_list
Определяет логические переменные, на которые ссылаются в
PATTERNпредложениях иMEASURESпредложениях.
Результат
Результат зависит от режима сопоставления строк:
ONE ROW PER MATCHВозвращает
PARTITION BYстолбцы, за которымиMEASURESследует столбцы.ALL ROWS PER MATCHВозвращает одну строку для каждой строки, которая участвует в совпадении. Каждая выходная строка включает соответствующие входные столбцы из
table_referenceстолбцов,PARTITION BYстолбцов иMEASURESстолбцов, вычисляемых для этого соответствия.
Распространенные условия ошибки
- MATCH_RECOGNIZE_EMPTY_MEASURES
- MATCH_RECOGNIZE_FUNCTION_OUTSIDE_MATCH_RECOGNIZE
- MATCH_RECOGNIZE_MEASURES_MUST_BE_ALIASED
- MATCH_RECOGNIZE_PARTITION_BY_MUST_BE_COLUMN
Examples
Каждый запрос использует таблицу stock_ticker(symbol, tstamp, price) , за исключением последнего примера, который использует page_views(user_id, event_time).
Пример 1. Последовательный рост выполнения
Найдите каждый максимальный запуск последовательного увеличения цен на символ. Переменная strt не DEFINE имеет записи, поэтому она соответствует любой строке и привязывает выполнение.
up+ расширяет совпадение по одному или нескольким последовательными увеличениями.
PREV(price) считывает цену непосредственно предыдущей строки в ORDER BY порядке.
ONE ROW PER MATCH выдает одну сводную строку для каждого запуска.
> CREATE OR REPLACE TEMP VIEW stock_ticker AS
SELECT * FROM VALUES
('AAPL', TIMESTAMP '2024-01-01 09:30:00', 100.0),
('AAPL', TIMESTAMP '2024-01-01 09:31:00', 102.0),
('AAPL', TIMESTAMP '2024-01-01 09:32:00', 105.0),
('AAPL', TIMESTAMP '2024-01-01 09:33:00', 104.0),
('AAPL', TIMESTAMP '2024-01-01 09:34:00', 106.0),
('AAPL', TIMESTAMP '2024-01-01 09:35:00', 108.0)
AS t(symbol, tstamp, price);
> SELECT symbol, start_tstamp, end_tstamp, run_length
FROM stock_ticker
MATCH_RECOGNIZE (
PARTITION BY symbol
ORDER BY tstamp
MEASURES FIRST(tstamp) AS start_tstamp,
LAST(tstamp) AS end_tstamp,
COUNT(*) AS run_length
ONE ROW PER MATCH
AFTER MATCH SKIP PAST LAST ROW
PATTERN ( strt up+ )
DEFINE up AS price > PREV(price) ) AS T;
symbol start_tstamp end_tstamp run_length
AAPL 2024-01-01 09:30:00 2024-01-01 09:32:00 3
AAPL 2024-01-01 09:33:00 2024-01-01 09:35:00 3
Пример 2. V-фигура (погружение и восстановление)
Определите цену, которая сначала падает, а затем поднимается.
down+ соответствует падающей ноге и up+ восстановлению.
LAST(down.tstamp) выбирает последнюю строку, классифицируемый как down, которая является тротым из V. Ссылка, соответствующая переменной, например down.tstamp позволяет MEASURES выражению считывать строки, соответствующие определенной переменной шаблона.
> SELECT symbol, start_tstamp, bottom_tstamp, end_tstamp
FROM stock_ticker
MATCH_RECOGNIZE (
PARTITION BY symbol
ORDER BY tstamp
MEASURES FIRST(tstamp) AS start_tstamp,
LAST(down.tstamp) AS bottom_tstamp,
LAST(tstamp) AS end_tstamp
ONE ROW PER MATCH
AFTER MATCH SKIP PAST LAST ROW
PATTERN ( strt down+ up+ )
DEFINE down AS price < PREV(price),
up AS price > PREV(price) ) AS T;
symbol start_tstamp bottom_tstamp end_tstamp
AAPL 2024-01-01 09:32:00 2024-01-01 09:33:00 2024-01-01 09:35:00
Пример 3. Двойное снизу (W-shape)
Обнаружение двух спадов, разделенных частичным восстановлением. Шаблон описывает четыре ноги (down1+ up1+ down2+ up2+), а различные имена переменных позволяют измерять или фильтровать каждый рывок независимо.
MATCH_NUMBER() числа каждого W, найденного в разделе.
> CREATE OR REPLACE TEMP VIEW stock_ticker AS
SELECT * FROM VALUES
('AAPL', TIMESTAMP '2024-01-01 09:30:00', 100.0),
('AAPL', TIMESTAMP '2024-01-01 09:31:00', 96.0),
('AAPL', TIMESTAMP '2024-01-01 09:32:00', 92.0),
('AAPL', TIMESTAMP '2024-01-01 09:33:00', 98.0),
('AAPL', TIMESTAMP '2024-01-01 09:34:00', 101.0),
('AAPL', TIMESTAMP '2024-01-01 09:35:00', 95.0),
('AAPL', TIMESTAMP '2024-01-01 09:36:00', 90.0),
('AAPL', TIMESTAMP '2024-01-01 09:37:00', 99.0),
('AAPL', TIMESTAMP '2024-01-01 09:38:00', 104.0)
AS t(symbol, tstamp, price);
> SELECT symbol, start_tstamp, end_tstamp, w_no
FROM stock_ticker
MATCH_RECOGNIZE (
PARTITION BY symbol
ORDER BY tstamp
MEASURES FIRST(tstamp) AS start_tstamp,
LAST(tstamp) AS end_tstamp,
MATCH_NUMBER() AS w_no
ONE ROW PER MATCH
AFTER MATCH SKIP PAST LAST ROW
PATTERN ( strt down1+ up1+ down2+ up2+ )
DEFINE down1 AS price < PREV(price),
up1 AS price > PREV(price),
down2 AS price < PREV(price),
up2 AS price > PREV(price) ) AS T;
symbol start_tstamp end_tstamp w_no
AAPL 2024-01-01 09:30:00 2024-01-01 09:38:00 1
Пример 4. Сеансизация
Свернуть поток событий пользователя в сеансы, где разрыв в течение более чем 30 минут между последовательными событиями запускает новый сеанс.
strt открывает сеанс в любой строке.
same_session* поглощает каждое следующее событие, которое происходит в течение 30 минут от своего предшественника. Когда разрыв превышает пороговое значение, совпадение заканчивается, AFTER MATCH SKIP PAST LAST ROW возобновляется на следующем событии и начинается новый сеанс (новый MATCH_NUMBER()). Квантификатор * делает однострочное событие допустимым однострочном сеансом.
> CREATE OR REPLACE TEMP VIEW page_views AS
SELECT * FROM VALUES
(1, TIMESTAMP '2024-01-01 09:00:00'),
(1, TIMESTAMP '2024-01-01 09:15:00'),
(1, TIMESTAMP '2024-01-01 10:00:00'),
(1, TIMESTAMP '2024-01-01 10:10:00')
AS t(user_id, event_time);
> SELECT user_id, session_no, session_start, session_end, event_count
FROM page_views
MATCH_RECOGNIZE (
PARTITION BY user_id
ORDER BY event_time
MEASURES MATCH_NUMBER() AS session_no,
FIRST(event_time) AS session_start,
LAST(event_time) AS session_end,
COUNT(*) AS event_count
ONE ROW PER MATCH
AFTER MATCH SKIP PAST LAST ROW
PATTERN ( strt same_session* )
DEFINE same_session AS event_time <= PREV(event_time) + INTERVAL 30 MINUTE ) AS T;
user_id session_no session_start session_end event_count
1 1 2024-01-01 09:00:00 2024-01-01 09:15:00 2
1 2 2024-01-01 10:00:00 2024-01-01 10:10:00 2