Size: a a a

ClickHouse не тормозит

2020 May 29

DT

Dmitry Titov in ClickHouse не тормозит
SiMo
Добрый день,
Прошу помощи бывалих так как знакомство только начал.
Задача следующая.
Есть несколько типов ивентов и таймстампом, все в одной табличе.
Нужно посчиать солько всего было каких ивентов каждый день за последние х дней.

К примеру:
|day 1| event A|
|day 2| event A|
|day 2| event B|
|day 3| event A|
|day 3| event C|
|day 4| event B|
|day 5| event A|


Ожидание
|A |B |C
day1|1 |0 |0
day2|2 |1 |0
day3|3 |1 |1
day4|3 |2 |1
day5|4 |2 |1

В постгре я бы решал это при помощи рекурсивных запросов.
Какие есть инструменты для этого в кликхаусе?
date, count(event_type='event_A') A,  count(event_type='event_B') B, count(event_type='event_C') C GROUP BY date
источник

DT

Dmitry Titov in ClickHouse не тормозит
вроде так можно, но если нельзя то можно через if)
источник

S

SiMo in ClickHouse не тормозит
если сделать GROUP BY date то это получается  просто по дням но не накопительно
источник

MM

Mariya Mansurova in ClickHouse не тормозит
Dmitry Titov
date, count(event_type='event_A') A,  count(event_type='event_B') B, count(event_type='event_C') C GROUP BY date
Только countIf(event_type = 'A') иначе возвращает общее число строк
источник

DT

Dmitry Titov in ClickHouse не тормозит
А, ну либо через neighbor суммировать(но вообще эта функция сбрасывается каждый блок, поэтому она довольно сомнительная)
источник

DT

Dmitry Titov in ClickHouse не тормозит
либо делать через массивы, а потом обратно ARRAY JOIN расжимать в строки
источник

DT

Dmitry Titov in ClickHouse не тормозит
Mariya Mansurova
Только countIf(event_type = 'A') иначе возвращает общее число строк
да, тогда нужно через if. ты права
count(val) не будет учитывать только те значения где null
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Argo
version 20.1.6.30 (official build)
обновитесь в 20.1.12.86
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Vladimir Bunchuk
спасибо
но почему-то такой таблицы в бд system нет
похоже это не вошло в 20.4, надо ждать 20.5
источник

VB

Vladimir Bunchuk in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
похоже это не вошло в 20.4, надо ждать 20.5
спасибо! будем ждать

Главное создать можно, а посмотреть созданное нельзя ))
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Vladimir Bunchuk
спасибо! будем ждать

Главное создать можно, а посмотреть созданное нельзя ))
cat /var/lib/clickhouse/access/users.list
источник

S

SiMo in ClickHouse не тормозит
Dmitry Titov
А, ну либо через neighbor суммировать(но вообще эта функция сбрасывается каждый блок, поэтому она довольно сомнительная)
Нашел, runningAccumulate караз решает такое, правда немогу пока понять почему он игнорирует group by
источник

VB

Vladimir Bunchuk in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
cat /var/lib/clickhouse/access/users.list
тут видно
спасибо )
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
SiMo
Нашел, runningAccumulate караз решает такое, правда немогу пока понять почему он игнорирует group by
она не понимает группы, если надо бегущую сумму внутри группы, то arrayCumSum
источник

DT

Dmitry Titov in ClickHouse не тормозит
SiMo
Нашел, runningAccumulate караз решает такое, правда немогу пока понять почему он игнорирует group by
потому, что это не агрегатная функция.
либо через подзапрос делать.
но вообще runningAccumulate тоже подвержен сбросу через блок
источник

T

Tim in ClickHouse не тормозит
SiMo
Добрый день,
Прошу помощи бывалих так как знакомство только начал.
Задача следующая.
Есть несколько типов ивентов и таймстампом, все в одной табличе.
Нужно посчиать солько всего было каких ивентов каждый день за последние х дней.

К примеру:
|day 1| event A|
|day 2| event A|
|day 2| event B|
|day 3| event A|
|day 3| event C|
|day 4| event B|
|day 5| event A|


Ожидание
|A |B |C
day1|1 |0 |0
day2|2 |1 |0
day3|3 |1 |1
day4|3 |2 |1
day5|4 |2 |1

В постгре я бы решал это при помощи рекурсивных запросов.
Какие есть инструменты для этого в кликхаусе?
А вы дальше с этим что хотите делать?
источник

T

Tim in ClickHouse не тормозит
Переслано от Tim
А можно как-то сгруппировать разные ключи по времени чтобы они сохранили значения? Как на картинке примерно
источник

T

Tim in ClickHouse не тормозит
Переслано от Denny Crane (I don't...
ts, groupArray(tuple(key,value))
group by ts
источник

T

Tim in ClickHouse не тормозит
Можно попробовать например собрать сначала в группу по дню и ключу, а дальше в массив.
Либо если у вас ивенты известны заранее точно сразу по ним колонки создавать, а вот создавать на лету колонки довольно сложно в клике
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Рич
привет! а подскажите таймзонам в clickhouse:

1. создаю таблицу с колонкой типа "Nullable(DateTime('UTC'))". Engine = MySQL и такую же с MergeTree. Делаю "insert into select * from". Данные в Mysql в UTC лежат
2. пытаюсь сконвертировать в таблице время Москву, ничего не меняется
3. select toDateTime(now(), 'Europe/London') тоже выдает текущее (московское) время
4. select toDateTime('2020-04-08 07:00:00', 'Europe/London') нормально меняет таймзону

сюда смотрел:
https://clickhouse.tech/docs/ru/sql-reference/data-types/datetime/
внутри КХ все в UTC. Таймзоны применяют при парсинге и рендеринге строк. Если ваш клиент не умеет время переводить то ничего и не будет.

выполняю на сервере

SELECT toDateTime(now(), 'Europe/London')

┌─toDateTime(now(), 'Europe/London')─┐
│                2020-05-29 15:07:15 │
└────────────────────────────────────┘

SELECT toString(now(), 'Europe/London')

┌─toString(now(), 'Europe/London')─┐
│ 2020-05-29 15:09:11              │
└──────────────────────────────────┘


через jdbc
select toDateTime(now(), 'Europe/London')
2020-05-29 11:07:25

select toString(now(), 'Europe/London')
2020-05-29 15:08:59
источник