Текстовый поиск ближайшего совпадения с использованием той же таблицы в ClickHouse

CREATE TABLE DB.table
(
    `date` Date,
    `path` String,
    `visits` UInt64,
    `users` UInt64
) ENGINE = MergeTree
PARTITION BY toYYYYMM( `date`)
ORDER BY  `date`
SETTINGS index_granularity = 8192

Вставить данные

INSERT INTO DB.Table (`date`,`path`,visits,users) VALUES ('2022-04-01','sofa',14837,12444);
INSERT INTO DB.Table (`date`,`path`,visits,users) VALUES ('2022-04-01','regalo',11917,8268);
INSERT INTO DB.Table (`date`,`path`,visits,users) VALUES ('2022-04-01','puertas',7498,6279);
INSERT INTO DB.Table (`date`,`path`,visits,users) VALUES ('2022-04-01','armario',7078,6230);
INSERT INTO DB.Table (`date`,`path`,visits,users) VALUES ('2022-04-01','sofa-cama',6771,5442);
INSERT INTO DB.Table (`date`,`path`,visits,users) VALUES ('2022-04-01','sofas',6182,5161);
INSERT INTO DB.Table (`date`,`path`,visits,users) VALUES ('2022-04-01','tractor-cortacesped',5740,3407);
INSERT INTO DB.Table (`date`,`path`,visits,users) VALUES ('2022-04-01','cocina',5634,4721);
INSERT INTO DB.Table (`date`,`path`,visits,users) VALUES ('2022-04-01','sillas',5448,4738);
INSERT INTO DB.Table (`date`,`path`,visits,users) VALUES ('2022-04-01','silla',448,478);

Я хочу получить ближайший соответствующий текст для каждого поля path, используя ту же таблицу

я читал этот пример, но в данном случае "clickhouse" не является значением той же таблицы...

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы понимаете, что это перекрестное соединение и в случае 10 строк это 100 вызовов ngramDistance?

SELECT DISTINCT
    arraySort([t1.path, t2.path]) AS pair,
    ngramDistance(t1.path, t2.path) AS dist
FROM t AS t1, t AS t2
WHERE t1.path != t2.path
ORDER BY dist ASC

Query id: 3cdeb2af-3628-4289-9d83-91d571aa70e7

┌─pair────────────────────────────────┬───────dist─┐
│ ['silla','sillas']                  │        0.2 │
│ ['sofa','sofas']                    │ 0.33333334 │
│ ['sofa','sofa-cama']                │ 0.71428573 │
│ ['sofa-cama','sofas']               │       0.75 │
│ ['puertas','sillas']                │          1 │
│ ['sofas','tractor-cortacesped']     │          1 │
│ ['cocina','sofa']                   │          1 │
│ ['sillas','sofa']                   │          1 │
│ ['silla','sofa']                    │          1 │
│ ['puertas','regalo']                │          1 │
│ ['armario','regalo']                │          1 │
│ ['regalo','sofa-cama']              │          1 │
│ ['regalo','sofas']                  │          1 │
│ ['regalo','tractor-cortacesped']    │          1 │
│ ['cocina','regalo']                 │          1 │
│ ['sofa','tractor-cortacesped']      │          1 │
│ ['regalo','silla']                  │          1 │
│ ['armario','puertas']               │          1 │
│ ['puertas','sofa-cama']             │          1 │
│ ['puertas','sofas']                 │          1 │
│ ['puertas','tractor-cortacesped']   │          1 │
│ ['cocina','puertas']                │          1 │
│ ['armario','sofa']                  │          1 │
│ ['puertas','silla']                 │          1 │
│ ['armario','sofa-cama']             │          1 │
│ ['armario','sofas']                 │          1 │
│ ['armario','tractor-cortacesped']   │          1 │
│ ['armario','cocina']                │          1 │
│ ['armario','sillas']                │          1 │
│ ['armario','silla']                 │          1 │
│ ['puertas','sofa']                  │          1 │
│ ['sofa-cama','tractor-cortacesped'] │          1 │
│ ['cocina','sofa-cama']              │          1 │
│ ['sillas','sofa-cama']              │          1 │
│ ['silla','sofa-cama']               │          1 │
│ ['regalo','sofa']                   │          1 │
│ ['cocina','sofas']                  │          1 │
│ ['sillas','sofas']                  │          1 │
│ ['silla','sofas']                   │          1 │
│ ['cocina','tractor-cortacesped']    │          1 │
│ ['sillas','tractor-cortacesped']    │          1 │
│ ['silla','tractor-cortacesped']     │          1 │
│ ['cocina','sillas']                 │          1 │
│ ['cocina','silla']                  │          1 │
│ ['regalo','sillas']                 │          1 │
└─────────────────────────────────────┴────────────┘

Спасибо Денни!!! работает отлично!

lino 10.05.2022 16:16

«Вы понимаете, что это перекрестное соединение, и в случае 10 строк это 100 вызовов ngramDistance?» Да, но я использую его только один раз в день, и я не знаю другого способа, потому что использовать скрипт Python будет сложнее. Спасибо!

lino 10.05.2022 16:26

Хорошо, Денни, ты прав, когда я использую это с реальными данными, покажи мне предел ошибок, превышенный «Получено исключение с сервера (версия 22.4.5): Код: 241. DB::Exception: Получено с локального хоста: 9000. DB::Exception : Превышен лимит памяти (для запроса): будет использовано 46,57 ГБ (попытка выделить фрагмент размером 33554496 байт), максимум: 46,57 ГБ. (MEMORY_LIMIT_EXCEEDED" Любая идея, как я мог бы выполнить этот (или аналогичный) SQL? Есть ли способ выполнить SQL, даже если это займет много времени?

lino 11.05.2022 10:28

Сколько строк в таблице?

Denny Crane 11.05.2022 13:46

Приблизительно 400 000 строк. Может быть, лучше использовать скрипт Python + исполняемый пул?

lino 12.05.2022 14:51

попробуй max_block_size=1000

Denny Crane 14.05.2022 16:45

не работает, используя этот запрос «SELECT DISTINCT arraySort ([t1.path, t2.path]) AS пара, ngramDistance (t1.path, t2.path) AS dist FROM database.table AS t1, database.table AS t2 ГДЕ t1.path != t2.path ORDER BY dist ASC LIMIT 100 SETTINGS max_block_size = 1000" "Выполнение: 443,18 тыс. строк, 12,50 МБ (3,19 тыс. строк/с., 89,89 КБ/с.) 49% 0 строк в наборе. Прошло: 139,849 с. Обработано 443,18 тыс. строк, 12,50 МБ (3,17 тыс. строк/с, 89,39 КБ/с)». Прогресс никогда не превышал 49%.

lino 15.05.2022 17:56

Другие вопросы по теме