Size: a a a

ClickHouse не тормозит

2021 March 06

ЮК

Юрий Кулаксыз... in ClickHouse не тормозит
Всем привет.
Есть необходимость собирать информацию о % удержания видео для дальнейшего формирования наиболее интересных.
Как лучше такое реализовать в КХ? В результате нужно будет отсортировать все видео именно по % удержания. Хочу сделать таблицу views, где primary будет video_id. И каждый просмотр хранить отдельно, так как нужна инфа о стране просмотра, кликах и тд.
Также у каждого просмотра (записи в таблице views) будет продолжительность.
Но как потом выбирать video_id с самым высоким процентом удержания или скажем в диапазоне 50-70?
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Юрий Кулаксыз
Всем привет.
Есть необходимость собирать информацию о % удержания видео для дальнейшего формирования наиболее интересных.
Как лучше такое реализовать в КХ? В результате нужно будет отсортировать все видео именно по % удержания. Хочу сделать таблицу views, где primary будет video_id. И каждый просмотр хранить отдельно, так как нужна инфа о стране просмотра, кликах и тд.
Также у каждого просмотра (записи в таблице views) будет продолжительность.
Но как потом выбирать video_id с самым высоким процентом удержания или скажем в диапазоне 50-70?
надо в ETL предгруппировать, нельзя посылать в КХ отдельными строками play_start, play_stop -- такое потом не собрать.
надо писать в КХ готовые просмотренные отрезки, причем несколько сразу в массив, и дисретизированные например до 5 сек.

время, click, userid, [(секунда_начало, длительность), (секунда_начало, длительность),....]

в MV можно посчитать общую длительность, %
источник

ЮК

Юрий Кулаксыз... in ClickHouse не тормозит
Я могу записывать даже сразу в %, то есть чтобы были отдельные записи просмотров с уже просчитанным %. Я не совсем понимаю как мне потом из этих данных получать, например, все video_id у которых % удержания > или < указанного
источник

ЮК

Юрий Кулаксыз... in ClickHouse не тормозит
Могу ли я выполнить что-то вроде
select video_id, avg(retention_percent) as rp from views where rt > 80 group by video_id
?
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Юрий Кулаксыз
Могу ли я выполнить что-то вроде
select video_id, avg(retention_percent) as rp from views where rt > 80 group by video_id
?
? having ?

select video_id, avg(retention_percent) as rp from views group by video_id having rt > 80
источник

ЮК

Юрий Кулаксыз... in ClickHouse не тормозит
Да, спасибо, банальная ошибка...
Ещё я думал над реализацией с помощью summing merge tree
Где я бы хранил % удержания и какое-то поле в котором всегда записана 1 (для того, чтобы после прибавления знать кол-во просмотров)
И при выборке выполнять что-то вроде
select video_id, (retention_percent / cnt) as rp
having rt > 80


Имеет ли такой подход права на жизнь?
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Юрий Кулаксыз
Да, спасибо, банальная ошибка...
Ещё я думал над реализацией с помощью summing merge tree
Где я бы хранил % удержания и какое-то поле в котором всегда записана 1 (для того, чтобы после прибавления знать кол-во просмотров)
И при выборке выполнять что-то вроде
select video_id, (retention_percent / cnt) as rp
having rt > 80


Имеет ли такой подход права на жизнь?
я НЕ до конца  понимаю  что такое %
я бы хранил сек. просмотра как метрику, чтобы она суммировалась, а длину как дименшин, ну и кол-во просмотров? (кликов play?) тоже как метрику.
источник

ЮК

Юрий Кулаксыз... in ClickHouse не тормозит
Я перед отправкой данных буду считать (сколько секунд просмотрено / продолжительность видео)
То есть для каждого просмотра заранее будет известно на сколько % его просмотрели. Таким образом в топе будут выводиться те ролики, которые пользователь досматривает до конца
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Юрий Кулаксыз
Я перед отправкой данных буду считать (сколько секунд просмотрено / продолжительность видео)
То есть для каждого просмотра заранее будет известно на сколько % его просмотрели. Таким образом в топе будут выводиться те ролики, которые пользователь досматривает до конца
да тут 768 вариантов.
Можно например дискретизировать % до 5, и хранить кол-во просмотревших каждый ролик или как Nested Map в summingMT или % как дименшин.
источник
2021 March 07

VZ

Vitaliy Zakaznikov in ClickHouse не тормозит
Daniil Lapko
Всем привет! Правильно я понимаю что live view который ссылается на другой live view не обновляется?
Да, верно.
источник

IB

Ilya Braslavskiy in ClickHouse не тормозит
Всем привет! Кто-нибудь сталкивался с проблемой, что из-за коротких проблем с сеткой падает консьюм с реббита и потом уже не восстанавливается?
источник

Р

Руслан in ClickHouse не тормозит
Ilya Braslavskiy
Всем привет! Кто-нибудь сталкивался с проблемой, что из-за коротких проблем с сеткой падает консьюм с реббита и потом уже не восстанавливается?
А как пишите с реббита в кликхауз?
источник

MK

Mikhail Kuzmin in ClickHouse не тормозит
Привет!
Если кратко, то мне нужна агрегатная функция sumMap, которая работает не для массивов, а для сгруппированных значений.
Но может быть и какой-то другой путь есть.

Есть табличка (app_id, name, point, value).
В один момент времени собирается несколько метрик.
Для некоторых метрик известны названия,
для некоторых - только шаблон названия.

Метрик в один момент собирается много, тысячи. И все они не нужны в ответе,
по этому выбрана такая схема, а не Nested.

Я хочу делать вычисления между метриками (не шаблонами), случившимися в один момент времени для заданного приложения.
Если бы названия метрик были извесны, то можно было бы применить комбинатор If,
но я знаю только шаблоны, а применять агрегационную функцию нужно в разрезе имени, а не шаблона.


CREATE TABLE metrics
(
 app_id    Int32,
 name      LowCardinality(String),
 point     DateTime,
 value     Float32
) ENGINE = MergeTree()
PRIMARY KEY (app_id, name, point)

select
 point,
 sumIf(value, name = 'X') as x,
 array(groupArray(name)) as name_g,
 array(groupArray(value)) as value_g,
 sumMapForEach(name_g, value_g)  -- не работает
from metrics
where
 point between '2021-02-18 13:00:00' and '2021-02-18 13:30:00'
 and app_id = 42
 and (name = 'X' or name like 'a/%/b')
group by point


Я придумал костыль - обернул группы в дополнительный массив и применил комбинатор ForEach,
но это не работает.

Похоже, что мне нужна функция sumMap', такая, что sumMap'Array == sumMap.

Или может быть какой-нибудь способ развернуть строки в столбцы? 🙂

upd:
похоже, что так работает, только не понятно зачем делать группировку для sumMapForEach, она же теперь не агрегатная

select
 point,
 http,
 sumMapForEach(name_g, value_g)
from (
select
 point,
 sumIf(value, name = 'X') as http,
 array(groupArray(name)) as name_g,
 array(groupArray(value)) as value_g
from metris
where
 point between '2021-02-18 13:00:00' and '2021-02-18 13:30:00'
 and app_id = 42
 and (name = 'X' or name like 'a/%/b')
group by point
) as sub
group by point, http

upd2: вроде бы arrayReduce('sumMap', array(name_g), array(value_g)) работает
источник

IB

Ilya Braslavskiy in ClickHouse не тормозит
RabbitMQ engine + mat view + mergetree
Все по инструкции_
источник

IB

Ilya Braslavskiy in ClickHouse не тормозит
Переслано от Руслан
А как пишите с реббита в кликхауз?
источник

DT

Dmitry Titov in ClickHouse не тормозит
Ilya Braslavskiy
RabbitMQ engine + mat view + mergetree
Все по инструкции_
пишите багу на гитхаб
источник

АЗ

Александр Загребельн... in ClickHouse не тормозит
Denny Crane [not a Yandex bot]
спасибо, я попробую воспроизвести,
попробуйте в профиле default добавить output_format_parallel_formatting>0</output_format_parallel_formatting>
Помогло, добавил в профиль default
<output_format_parallel_formatting>0</output_format_parallel_formatting>
Архивный файл успешно создан под версией 21.2.5.5, хотя запросы выполнял от другого пользователя (он был создан запросом).
Спасибо за помощь !  А есть какие-либо минусы, побочные эффекты или ограничения у такой настройки ?
источник

L

Lesha in ClickHouse не тормозит
Гайз, а при создании словаря из кх таблицы, можно ли как-то указать аттрибут table FINAL. Я хочу сделать словарь в памяти из ReplacingMergeTree MV. Могу ли я как-то рассчитывать, что в dict попадут актуальные значения?
источник

DT

Dmitry Titov in ClickHouse не тормозит
Lesha
Гайз, а при создании словаря из кх таблицы, можно ли как-то указать аттрибут table FINAL. Я хочу сделать словарь в памяти из ReplacingMergeTree MV. Могу ли я как-то рассчитывать, что в dict попадут актуальные значения?
Можно сделать словарь из вьюхи
источник

L

Lesha in ClickHouse не тормозит
Dmitry Titov
Можно сделать словарь из вьюхи
О прикольно, чет не подумал. Работает)
источник