Size: a a a

ClickHouse не тормозит

2021 March 02

DK

Dmitry Krylov in ClickHouse не тормозит
Dmitry Titov
> SELECT x, if(x = 3, 1, neighbor(y, -1) * 2 + x) as y FROM tbl

А оно точно так не работает?
Нет, так не работает. Ругается, что y не определено:

localhost :) SELECT x, if(x = 3, 1, neighbor(y, -1) * 2 + x) as y FROM a;

SELECT
   x,
   if(x = 3, 1, (neighbor(y, -1) * 2) + x) AS y
FROM a

Query id: 4ef9c2e8-4486-4e17-9971-ebc47f9ad60d


Received exception from server (version 21.2.3):
Code: 47. DB::Exception: Received from localhost:9000. DB::Exception: Missing columns: 'y' while processing query: 'SELECT x, if(x = 3, 1, (neighbor(y, -1) * 2) + x) AS y FROM a', required columns: 'x' 'y', maybe you meant:  '['x']' '['x']'.

0 rows in set. Elapsed: 0.003 sec.
источник

DK

Dmitry Krylov in ClickHouse не тормозит
Да, спасибо. Попробую
источник

DT

Dmitry Titov in ClickHouse не тормозит
SELECT
   x,
   if(x = 3, 1, (neighbor(y, -1) * 2) + x) AS y
FROM
(
   SELECT
       number AS x,
       number AS y
   FROM numbers(10)
)

Query id: fcf3035b-a7ce-43c2-807b-2af4158a9713

┌─x─┬──y─┐
│ 0 │  0 │
│ 1 │  1 │
│ 2 │  4 │
│ 3 │  1 │
│ 4 │ 10 │
│ 5 │ 13 │
│ 6 │ 16 │
│ 7 │ 19 │
│ 8 │ 22 │
│ 9 │ 25 │
└───┴────┘
источник

DK

Dmitry Krylov in ClickHouse не тормозит
Не то, к сожалению. Оно берёт уже записанные значения из y.

Именно поэтому для x = 4 получается 10, а не 1*2 + 4 = 6
источник

DT

Dmitry Titov in ClickHouse не тормозит
Dmitry Krylov
Не то, к сожалению. Оно берёт уже записанные значения из y.

Именно поэтому для x = 4 получается 10, а не 1*2 + 4 = 6
А, понял чего хочешь,
Насколько сложная агрегатная функция?
источник

DK

Dmitry Krylov in ClickHouse не тормозит
Ну у меня там

IF(SIGN(x) * SIGN(y_last) = -1, MIN(ABS(x), ABS(y_last)), 0),

примерно так.
Где y_last -- предыдущее значение.
источник

DK

Dmitry Krylov in ClickHouse не тормозит
Так-то с *2 особых проблем нет.
источник

DK

Dmitry Krylov in ClickHouse не тормозит
А вот как эти min/abs раскрыть в аггрегатные функции -- пока не понятно
источник

DK

Dmitry Krylov in ClickHouse не тормозит
Поэтому решил втупую, с использованием предыдущего значения
источник

DT

Dmitry Titov in ClickHouse не тормозит
min -> least не агрегатная функция, abs тоже не агрегатная
источник

DK

Dmitry Krylov in ClickHouse не тормозит
Да, у меня там не аггрегатная функция, просто вычисление от текущего значения в одной колонке и предыдущего из другой.

(Была бы формула попроще, я бы как-то свёл её к поддерживаемым Clickhouse, но с этим if / sign / min / abs -- не получается.)
источник

DT

Dmitry Titov in ClickHouse не тормозит
У нуля sign = 1 ?
источник

DK

Dmitry Krylov in ClickHouse не тормозит
Нет, 0
источник

DT

Dmitry Titov in ClickHouse не тормозит
Окей, значит как только получился 0, все остальные значения тоже 0?
источник

DK

Dmitry Krylov in ClickHouse не тормозит
Да, но можно считать, нулей не будет точно.
источник

DT

Dmitry Titov in ClickHouse не тормозит
Dmitry Krylov
Да, но можно считать, нулей не будет точно.
если нулей не будет то зачем это условие IF?
источник

DK

Dmitry Krylov in ClickHouse не тормозит
Ох :) Ну, на самом деле, там просто ещё четыре значения вычисляются, и вот этот y уже берётся как 4-ое значение.
Просто те значения считаются относительно того IF и текущих значений. Если бы удалось этот "рекурсивный" IF посчитать,
то проблем с остальным не было бы.

Поэтому я и привёл самую сложную часть вычислений, которую я не могу на SELECT натянуть.

Ну ок, пусть будет так:


IF(SIGN(y_last) = 1, MIN(ABS(x), ABS(y_last)), 0)
источник

DK

Dmitry Krylov in ClickHouse не тормозит
У меня просто такое ощущение, что это как-то очень просто в Clickhouse как колоночной СУБД должно делаться.
Это ж простое линейное сканирование двух колонок, только с переиспользованием второй...
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Виктор
Сделал MV ReplicatedAggregatingMT + Distributed
При селекте из Distributed получаю ошибку:

DB::Exception: Stack size too large. Stack address: 0x7f12c0ad4000, frame address: 0x7f12c0ed1f10, stack size: 4202736, maximum stack size: 8388608.
это рекурсия бесконечная, Distributed смотрит на саму себя, банально опечатка
источник

В

Виктор in ClickHouse не тормозит
Denny Crane [not a Yandex bot]
это рекурсия бесконечная, Distributed смотрит на саму себя, банально опечатка
да, после переименования так и получилось
источник