
Nikolai
06.09.2017
13:55:32

Vladimir
06.09.2017
13:55:56
если это какой-нибудь vps/vds - возможно иногда, что провайдер не экспортирует SSE4.2, хотя процессор его поддерживает
обычно решается вопросом в саппорт

Денис
06.09.2017
13:56:10
хотя всеравно же из контейнера запускаю

Google

Vladimir
06.09.2017
13:57:00
он передает ровно то что сказал host
а вот qemu/kvm/xen могут
и даже больше - по умолчанию kvm экспортирует только базовый набор инструкций

Stas
06.09.2017
13:58:46
А как лучше хранить вложенные массивы в CH? документация говорит что основном типе таблиц работать не будет

papa
06.09.2017
14:05:11
хранить в виде массива.
а что именно не будет работать по мнению документации?

Kirill
06.09.2017
14:15:57
дословно вот так
Массив из элементов типа T. Типом T может быть любой тип, в том числе, массив. Многомерные массивы не рекомендуется использовать, так как их поддержка довольно слабая (например, многомерные массивы нельзя сохранить в таблицы с движком семейства MergeTree).

papa
06.09.2017
14:25:11
а, то есть вы хотите массивы массивов. да, есть такая проблема.

Mike
06.09.2017
14:54:28
Господа, подскажите что можно сделать, если хочется результат типа runningDifferrence с группировкой?

Bulat
06.09.2017
15:10:47
в нем хранится время попадания записи в кликхаус.

Stas
06.09.2017
15:18:27

Google

Sergey
06.09.2017
16:48:29
Доброго времени суток
Кто-нибудь работал с регулярками?
select match('11 11 11', '[0-9]') возвращает 1, несмотря на пробелы
Нужна регулярка вида [0-9+-\(\)\s]+

Vladimir
06.09.2017
17:03:22
Раз нужно не вхождение, а соответствие
Вроде в кх re2
Или я не прав?

Алексей
06.09.2017
17:09:42
re2 это go же

Sergey
06.09.2017
17:10:05
Да, re2. Не приходилось раньше с ними работать.
Якоря помогли, спасибо)

Vladimir
06.09.2017
17:11:53
Просто в го реализация как в ре2

Alexey
06.09.2017
17:12:13

Vladimir
06.09.2017
17:13:06
RE2 was designed and implemented with an explicit goal of being able to handle regular expressions from untrusted users without risk. One of its primary guarantees is that the match time is linear in the length of the input string.
https://github.com/google/re2/wiki/WhyRE2

Maksim
06.09.2017
17:14:21
Нужна одна

Alexey
06.09.2017
17:14:36
Или округли хотя бы до минуты.

Maksim
06.09.2017
17:21:44
Я думаю что мне нужна предагрегация и отдельно складывать кол-во онлайн в каждую секунду

papa
06.09.2017
17:27:40
а читать вы это значение тоже будете каждую секунду?

Vsevolod
06.09.2017
18:19:38
Добрый день!
Скажите пожалуйста, можно ли создать такую цепочку таблиц и представлений?
T(MergeTree) -> MV(AggregateMergeTree) -> V(MergeTreee) -> MV(MergeTree).

Google

Александр
06.09.2017
18:20:08

Vsevolod
06.09.2017
18:20:24
Попробовал, в последнем MV не обновляются записи (

Alexey
06.09.2017
18:22:56
Обновление MV через View не поддерживается.

Vsevolod
06.09.2017
18:27:38
А MV через MV?

Maksim
06.09.2017
18:33:47

Alexey
06.09.2017
18:34:01

Александр
06.09.2017
18:34:03
У меня работало
Я травил MV на MV и работало

Maksim
06.09.2017
18:34:20
У меня сессии видеопросмотра и когда человек листает каналы, у него идут сессии одна за одной
Но при этом онлайн только одна

Александр
06.09.2017
18:35:05

Alexey
06.09.2017
18:35:59
Можно попробовать записывать в базу по одному событию каждую секунду просмотра видео. Потом считать с помощью GROUP BY. Это если не слишком много одновременных просмотров. Хотя кажется, что это не лучше, чем размножать налету с помощью range.


Александр
06.09.2017
18:38:33
Можно попробовать записывать в базу по одному событию каждую секунду просмотра видео. Потом считать с помощью GROUP BY. Это если не слишком много одновременных просмотров. Хотя кажется, что это не лучше, чем размножать налету с помощью range.
Мы сделали по другому. У нас есть эвенты во время просмотра видео: запуск, пауза, сик, завершение просмотра. На каждый эвент у нас кумулятивно собираются промежутки просмотра видео.
Пример. Видео длительностью в 60 секунд.
Состояние на момент загрузки страницы
var currentRange = [];
var ranges = [];
Запуск видео.
var currentRange = [0];
var ranges = [];
Пауза на 10 секунде.
var currentRange = [];
var ranges = [[0, 10]];
Сик на остановленном видео с 10 секунды на 30.
var currentRange = [];
var ranges = [[0, 10]];
Запуск видео с паузы на 30 секунде после сика.
var currentRange = [30];
var ranges = [[0, 10]];
Сик на играющем видео с 36 секунды до 50.
var currentRange = [50];
var ranges = [[0, 10], [30, 36]];
Просмотр видео завершен на 60 секунде.
var currentRange = [];
var ranges = [[0, 10], [30, 36], [50, 60]];
Таким образом получаем информацию о том, что обучающимся были просмотрены промежутки видео
0-10, 30-36, 50-60 секунды.
Потом достаточно просто разбираем данные и считаем например количество уникальных пользователей посмотревших кажду секунду видео, сколько раз вообще была просмотрена каждая секунда видео и пр., где точки отказов и пр.


papa
06.09.2017
18:39:36
если в таблице сессий есть юзер.
тогда подряд идущие сессии сплющит в единицу.

Maksim
06.09.2017
18:52:31

Vsevolod
06.09.2017
18:52:56

Google

Maksim
06.09.2017
18:52:58
Например мозаика

papa
06.09.2017
18:58:11
да, получается что округление искажает статистику, хоть и непонятно насколько.

Vladislav
06.09.2017
19:11:13
а что произойдет, если удалить одну из папок в data/dbname/tablename у реплицируемой таблицы? недостающие данные подтянутся от другой реплики?

Alexey
06.09.2017
19:12:10
Это произойдёт при первой попытке что-то прочитать из испорченных/удалённых данных, или, если данные никто не читает - при следующем запуске сервера.

Vladislav
06.09.2017
19:14:10
Недавно спрашивал про OPTIMIZE TABLE – как-то странно он работает:
- иногда сразу отвечает OK (меньше секунды задержка), но по графане видно, что процесс оптимизации идет
- иногда выполняется только на одной из двух реплик (видимо, из-за недостатка места на одной)
- долгий ответ, пока не закончится процесс оптимизации. Это, я так понимаю, самый нормальный случай


Alexey
06.09.2017
19:19:26
> - иногда сразу отвечает OK (меньше секунды задержка), но по графане видно, что процесс оптимизации идет
Обычно это говорит о том, что куски для мержа не выбраны (нечего выбирать - данные уже помержены, мержатся сейчас, есть отсутствующие куски, которые надо скачать с реплики, нет места на диске...), либо выбраны мелкие куски, и они быстро помержены.
> - иногда выполняется только на одной из двух реплик (видимо, из-за недостатка места на одной)
Возможно.
> - долгий ответ, пока не закончится процесс оптимизации. Это, я так понимаю, самый нормальный случай
Да, это самое ожидаемое для крупного мержа.

Vladislav
06.09.2017
19:21:50
Спасибо.

Kirill
06.09.2017
19:23:41
Всем привет, у нас есть кейс когда мы делаем detach в одной таблице и перекладываем партиции в другую после чего делаем attach, т.к. в detached складываются не только "отцепленные" партиции, но и битые куски, мы иногда напарываемя на то что мы их синкаем и attach непроходит. Как можно прочекать партиции в detached чтоб синхронизировать только валидные или как можно обезопасить себя от подобного поведения ?

Alexey
06.09.2017
19:24:50
Битые должны быть под именем broken_*, ignored_*, unexpected_*...

Kirill
06.09.2017
19:30:56
Спасибо, с этим понятно, еще мы вот такую ошибку словили
2017.09.05 11:01:39.052615 [ 26 ] <Error> executeQuery: Code: 228, e.displayText() = DB::Exception: /var/lib/clickhouse/data/reports/advertiser_full/detached/20170903_20170903_30_30_0/raw_clicks.mrk has unexpected size: 1803 instead of 2240, e.what() = DB::Exception (from 192.168.199.21:56144) (in query: ALTER TABLE "reports"."advertiser_full" ATTACH PARTITION 201709), Stack trace:
полный лог
https://gist.githubusercontent.com/kshvakov/5954f73e88b51e314e11938a7d31d783/raw/3e8402d30a035123813cb09ee741559e95663f4c/ch_segfault.log

Alexey
06.09.2017
19:33:01
В логе всё плохо. А версия сервера какая?

Kirill
06.09.2017
19:33:42
v1.1.54284

Alexey
06.09.2017
19:35:57
Мы пока что думаем, что это хорошая версия. Но что-то не так. В логе две проблемы: 1. Откуда-то появился кусок с неправильными данными. 2. sefgault.
По трейсу источник проблемы не удаётся понять. Насколько это воспроизводимо?

Kirill
06.09.2017
19:37:37
Такая ошибка 1 раз была, операция detach/attach достаточно частая
Сделаю логирование чексум того что мы отцепили и пытаемся прицепить, чтоб если еще раз выпадет было понятно - либо при перемещении что-то сломалось, либо действительно сам кусок с неправильными данными был


Constantine
06.09.2017
20:00:22
Ребят, всем привет, есть вопрос. Не знаю, как решить средствами КХ.
Есть таблица для ивентов вида:
(
ID UInt32
Event String
GUID String
Path String
IP UInt32
UserID UInt32
TrackedDate Date
)
GUID — идентификатор юзера в браузере (кука), Event — что произошло (page или image), Path — урл события, UserID — некий параметр для группы.
У меня есть задача — получить все ивенты с Path = %success% с Event = page` для которых есть другой Event = image. собственно это решается достаточно легко:
SELECT *
FROM analytics.EventTrack
WHERE (UserID = 92) AND (Event = 'page') and (Path like '%onepage/success%') AND (TrackedDate >= toDate('2017-09-01')) AND GUID IN (
SELECT GUID
FROM analytics.EventTrack
WHERE (UserID = 92) AND (Event = 'image') AND (TrackedDate >= toDate('2017-09-01'))
)
Есть ситуация, когда пользователь сменил браузер, то есть у него может быть два GUID, но одинаковый IP. В реляционной БД я бы сделал алиас для таблицы и в сабквери бы сверял IP и дату (допустим, не больше суток, потому что динамический айпи, все дела).
Как сделать в КХ, понятия не имею. Были мысли пробовать собирать IP адреса с датами в Memory таблицу (не работал ранее). Но правильно ли это?
так, сорри про подсветку кода, получилось так себе, но лучше, чем просто плейном


Александр
06.09.2017
20:10:21
Ребят, всем привет, есть вопрос. Не знаю, как решить средствами КХ.
Есть таблица для ивентов вида:
(
ID UInt32
Event String
GUID String
Path String
IP UInt32
UserID UInt32
TrackedDate Date
)
GUID — идентификатор юзера в браузере (кука), Event — что произошло (page или image), Path — урл события, UserID — некий параметр для группы.
У меня есть задача — получить все ивенты с Path = %success% с Event = page` для которых есть другой Event = image. собственно это решается достаточно легко:
SELECT *
FROM analytics.EventTrack
WHERE (UserID = 92) AND (Event = 'page') and (Path like '%onepage/success%') AND (TrackedDate >= toDate('2017-09-01')) AND GUID IN (
SELECT GUID
FROM analytics.EventTrack
WHERE (UserID = 92) AND (Event = 'image') AND (TrackedDate >= toDate('2017-09-01'))
)
Есть ситуация, когда пользователь сменил браузер, то есть у него может быть два GUID, но одинаковый IP. В реляционной БД я бы сделал алиас для таблицы и в сабквери бы сверял IP и дату (допустим, не больше суток, потому что динамический айпи, все дела).
Как сделать в КХ, понятия не имею. Были мысли пробовать собирать IP адреса с датами в Memory таблицу (не работал ранее). Но правильно ли это?
У нас сейчас похожая история со списком пользователей имеется. Есть определенная бизнес-логика по которой собирается конечный список пользователей по которым агрегировать данные. Мы собираем список, в TSV файлик и вместе с select запросом на сервер в виде временной таблицы. Работает замечательно.

Google

Александр
06.09.2017
20:10:34
Но в вашем случае я полагаю таблица может быть огромная
Я бы попробовал подключить словарь и сделать его таблицей

Constantine
06.09.2017
20:11:12
не, не сильно )

Александр
06.09.2017
20:11:14
Не уверен на счет производительности, т.к. у меня на таких экспериментах при наличии > 2кк строк был лаг примерно в секунду

Constantine
06.09.2017
20:11:29
1 секунда для меня допустимо )
там в среднем будет порядка 1000-2000 ip, потому что фильтр идет по типу ивента (он достаточно редкий) и юзеру + дата )

Александр
06.09.2017
20:12:10
Ну тогда можете попробовать подключить внешнюю таблицу в виде словаря и сделать create table dates_ips engine = Dictionary(dict_name)
Ну либо как вариант слать файлик в виде временной таблицы на каждый запрос

Constantine
06.09.2017
20:12:38
ага, спасиб. сейчас почитаю
временную таблицу в памяти из КХ разве нельзя создать?

Александр
06.09.2017
20:12:57
У меня даже 50к строк с идентификаторами достаточно быстро доставляются и запросы отрабатывают очень быстро
Она создается автоматически при получении файла при select запросе
Сейчас дам ссылку на доку

Constantine
06.09.2017
20:13:20
ааа
спасибо, буду благодарен!

Александр
06.09.2017
20:13:42
Можно временную таблицу создать и писать туда данные, но есть вероятность их потерять при падении сервера