Последнее обновление
ARRAYS_OVERLAP
Назначение
ARRAYS_OVERLAP проверяет, есть ли у двух массивов хотя бы один общий элемент. Если есть, возвращает true, иначе возвращает false.
Синтаксис
ARRAYS_OVERLAP(arr1, arr2)
Параметры
-
arr1: Первый массив типаARRAY<T>. -
arr2: Второй массив типаARRAY<T>.- Типы элементов
Tобоих массивов должны совпадать или допускать взаимное неявное преобразование. - Тип элемента
Tможет быть числовым, строковым, типом даты/времени, IP или UUID.
- Типы элементов
Возвращаемое значение
-
Возвращает значение типа
BOOLEAN:- Если у двух массивов есть общие элементы, возвращает
true; - Если общих элементов нет, возвращает
false.
- Если у двух массивов есть общие элементы, возвращает
Примечания по использованию
- Сравнение выполняется по равенству элементов (оператор
=). - В этой функции
NULLиNULLсчитаются равными (см. пример). - Можно указать инвертированный индекс в операторе создания таблицы, чтобы ускорить выполнение (см. пример).
- Если функция используется в условии предиката, инвертированный индекс ускоряет выполнение.
- Если функция используется в результате запроса, инвертированный индекс не ускоряет выполнение.
- Часто используется для очистки данных, сопоставления тегов и поиска пересечений в поведении пользователей.
Примеры
-
Простой пример
SELECT ARRAYS_OVERLAP(ARRAY('hello', 'aloha'), ARRAY('hello', 'hi', 'hey'));
+----------------------------------------------------------------------+
| ARRAYS_OVERLAP(ARRAY('hello', 'aloha'), ARRAY('hello', 'hi', 'hey')) |
+----------------------------------------------------------------------+
| 1 |
+----------------------------------------------------------------------+
SELECT ARRAYS_OVERLAP(ARRAY('Pinnacle', 'aloha'), ARRAY('hi', 'hey'));
+----------------------------------------------------------------+
| ARRAYS_OVERLAP(ARRAY('Pinnacle', 'aloha'), ARRAY('hi', 'hey')) |
+----------------------------------------------------------------+
| 0 |
+----------------------------------------------------------------+ -
Недопустимый тип параметра: при передаче неподдерживаемых типов возвращается
INVALID_ARGUMENT-- [INVALID_ARGUMENT] execute failed, unsupported types for function arrays_overlap
SELECT ARRAYS_OVERLAP(ARRAY(ARRAY('hello', 'aloha'), ARRAY('hi', 'hey')), ARRAY(ARRAY('hello', 'hi', 'hey'), ARRAY('aloha', 'hi'))); -
Если входной
ARRAYравенNULL, возвращаемое значение равноNULLSELECT ARRAYS_OVERLAP(ARRAY('HELLO', 'ALOHA'), NULL);
+-----------------------------------------------+
| ARRAYS_OVERLAP(ARRAY('HELLO', 'ALOHA'), NULL) |
+-----------------------------------------------+
| NULL |
+-----------------------------------------------+
SELECT ARRAYS_OVERLAP(NULL, NULL);
+----------------------------+
| ARRAYS_OVERLAP(NULL, NULL) |
+----------------------------+
| NULL |
+----------------------------+ -
Если входной
ARRAYсодержитNULL, значенияNULLиNULLсчитаются равнымиSELECT ARRAYS_OVERLAP(ARRAY('HELLO', 'ALOHA'), ARRAY('HELLO', NULL));
+---------------------------------------------------------------+
| ARRAYS_OVERLAP(ARRAY('HELLO', 'ALOHA'), ARRAY('HELLO', NULL)) |
+---------------------------------------------------------------+
| 1 |
+---------------------------------------------------------------+
SELECT ARRAYS_OVERLAP(ARRAY('PICKLE', 'ALOHA'), ARRAY('HELLO', NULL));
+----------------------------------------------------------------+
| ARRAYS_OVERLAP(ARRAY('PICKLE', 'ALOHA'), ARRAY('HELLO', NULL)) |
+----------------------------------------------------------------+
| 0 |
+----------------------------------------------------------------+
SELECT ARRAYS_OVERLAP(ARRAY(NULL), ARRAY('HELLO', NULL));
+---------------------------------------------------+
| ARRAYS_OVERLAP(ARRAY(NULL), ARRAY('HELLO', NULL)) |
+---------------------------------------------------+
| 1 |
+---------------------------------------------------+ -
Использование инвертированного индекса для ускорения запроса
-- Create table with inverted index
CREATE TABLE IF NOT EXISTS arrays_overlap_table (
id INT,
array_column ARRAY<STRING>,
INDEX idx_array_column (array_column) USING INVERTED -- only non-tokenized inverted indexes are allowed
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES (
"replication_num" = "1"
);
-- Insert two rows
INSERT INTO arrays_overlap_table (id, array_column) VALUES (1, ARRAY('HELLO', 'ALOHA')), (2, ARRAY('NO', 'WORLD'));
-
Если функция используется в условии предиката, инвертированный индекс ускоряет выполнение
SELECT * from arrays_overlap_table WHERE ARRAYS_OVERLAP(array_column, ARRAY('HELLO', 'PICKLE'));
+------+--------------------+
| id | array_column |
+------+--------------------+
| 1 | ["HELLO", "ALOHA"] |
+------+--------------------+ -
Если функция используется в результате запроса, инвертированный индекс не ускоряет выполнение
SELECT ARRAYS_OVERLAP(array_column, ARRAY('HELLO', 'PICKLE')) FROM arrays_overlap_table;
+--------------------------------------------------------+
| ARRAYS_OVERLAP(array_column, ARRAY('HELLO', 'PICKLE')) |
+--------------------------------------------------------+
| 1 |
| 0 |
+--------------------------------------------------------+