@clickhouse_ru

Страница 573 из 723
strange
02.07.2018
11:12:27
Ip_trie словарь со списком всех интернет сетей и автономок, connection_log на несколько миллиардов строк, и запрос с группировкой и сортировкой по номеру автономки отрабатывает за разумное количество секунд.
ммм, а вот например запихнуть туда пачку ip и получить соответствие ip<->подсеть? это можно как-то сделать через, условно говоря, where IP IN (ip_trie_clause)

Vladimir
02.07.2018
11:15:44
Извините что туплю

Может кто видит почему семплинг не помогает по скорости?

Google
Vladimir
02.07.2018
11:16:05
SELECT sum(value) FROM Metrics SAMPLE 1 / 10 ┌───────────sum(value)─┐ │ 17577274172239137000 │ └──────────────────────┘ 1 rows in set. Elapsed: 9.238 sec. Processed 3.69 billion rows, 44.23 GB (398.96 million rows/s., 4.79 GB/s.) tsf-data11.us.sematext.com :) select sum(value) from Metrics; SELECT sum(value) FROM Metrics ┌───────────sum(value)─┐ │ 17577889402538699000 │ └──────────────────────┘ 1 rows in set. Elapsed: 7.030 sec. Processed 3.69 billion rows, 29.48 GB (524.30 million rows/s., 4.19 GB/s.) tsf-data11.us.sematext.com :) select sum(value) from Metrics SAMPLE 1/100; SELECT sum(value) FROM Metrics SAMPLE 1 / 100 ┌───────────sum(value)─┐ │ 17578875733901701000 │ └──────────────────────┘ 1 rows in set. Elapsed: 9.241 sec. Processed 3.69 billion rows, 44.23 GB (398.87 million rows/s., 4.79 GB/s.) tsf-data11.us.sematext.com :) show create Metrics SHOW CREATE TABLE Metrics ┌─statement───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ CREATE ... ORDER BY (appId, metricId, timestamp) SAMPLE BY metricId SETTINGS index_granularity = 8192 └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ 1 rows in set. Elapsed: 0.001 sec.

Судя по сумме семплирования не происходит

papa
02.07.2018
11:17:09
а metricId у вас равномерно распределен по значениям своего типа?

Michal
02.07.2018
11:17:27
Т.е. в ip_trie может быть несколько подходящих под условие подсетей. Типа 10.0.0.0/8 и одновременно 10.1.2.0/23 . И если спросите про адрес 10.1.2.3 то выберет вторую подсеть, как более "специфичную" хотя первая тоже подходит.

Evgeny
02.07.2018
11:40:11
День добрый! Можно ли для клика использовать zookeeper с kerberos? Если да, то где прочитать о настройке?

Дмитрий
02.07.2018
11:48:22
господа, а как truncate table сделать?

Evgeny
02.07.2018
11:48:47
сорян ...drop partition

Дмитрий
02.07.2018
11:49:11
мне целиком табличку почистить

Stanislav
02.07.2018
11:49:40
Если туда не пишется ничего - подропать все партишны и всё

Google
Vladimir
02.07.2018
11:51:09
а metricId у вас равномерно распределен по значениям своего типа?
не совсем понял вопроса это поле имеет значение от 1 до 10000 и распределение не совсем равномерное Ну тоесть значении 2 может быть миллион а 2002 может быть 20 миллионов

papa
02.07.2018
11:51:54
sample 1/100 эквивалентно условию metricId < max_value/100

Vladimir
02.07.2018
11:52:13
теперь понял

в таком случае все равно должно работать, может немного криво из-за неравномерного распределения

Vladimir
02.07.2018
11:53:14
судя по запросам семплинг вообще не работет

papa
02.07.2018
11:53:50
max_value это не 10000, а 2^32 или какой у вас тип у metricId

Vladimir
02.07.2018
11:54:20
упс

это все поменяло

papa
02.07.2018
11:54:59
в таких случаях можно семплировать например по inthash32(.)

Vladimir
02.07.2018
11:55:33
и как быть если надо аггрегировать по метрикИд но значении может быть так много что нужно только по 10% например

papa
02.07.2018
11:55:39
но нужно чтобы на один appId было много metricId

papa
02.07.2018
11:56:40
это при создании таблицы

Vladimir
02.07.2018
11:56:53
как эту част переписать?

ORDER BY (appId, metricId, timestamp) SAMPLE BY (metricId);

я понимаю что при создании я имею в виду что как семплтинг ключ написать

вместо metricId

inthash32(metricId) ?

Google
papa
02.07.2018
11:58:41
угу

но если вы селектите отдеьные metricId, то наверное надо будет тоже запрос поравить чтобы индекс использовался.

Vladimir
02.07.2018
11:59:14
и это же выражение в первичном ключе?

papa
02.07.2018
11:59:53
угу, если не отсортировать, то фокус не получится.

Vladimir
02.07.2018
12:00:25
а условие metricId=xxx будет при таком ключе по ключу отрабатывать? ORDER BY (appId, inthash32(metricId), timestamp) SAMPLE BY (inthash32(metricId));

Vladimir
02.07.2018
12:01:09
или в запросе надо будет писать inthash32(metricId)=xxx ?

уфф, красота будет

papa
02.07.2018
12:01:33
предположу что нет. но metricId=xxx and intHash32(metricId)=intHash32(xxx) должно.

Vladimir
02.07.2018
12:02:06
понял спсб

спсб большое

sample 1/100 эквивалентно условию metricId < max_value/100
уфф только что понял что мне это не подходит У меня в запросе есть условие *metricId=2* например и мне надо чтобы сумма была построена не по всем точкам а только по 10% например Получается мне семплирование по таймстемпу надо но это вроде бы не есть гуд

Sergei
02.07.2018
12:16:15
Всем привет! А где почитать про ORDER BY и как его лучше указывать? Вот допустим у нас есть Immutable Event Log по userId с eventType и eventId, а так же timestamp (DateTime). Мы используем ReplacingMergeTree (на случай если два раза одно и тоже событие запишется в ClickHouse), на данный момент вот так: ENGINE = ReplacingMergeTree PARTITION BY toYYYYMM(timestamp) ORDER BY (userId, eventType, eventId) на сколько это правильно \ нет? ORDER BY очень сбивает с толку названием, я так понимаю он тут больше как кассандровский PRIMARY KEY, не?

Sergei
02.07.2018
12:17:43
и создавать materialized views

в основном ad hoc запросы в стиле "а сколько у нас юзеров <...>"

papa
02.07.2018
12:19:05
юзеров - это userid?

Sergei
02.07.2018
12:19:17
Угу

papa
02.07.2018
12:19:42
тогда наверное не имеет смысла по ним сортировать, у вас же не будет на них условия.

Google
Sergei
02.07.2018
12:20:15
т.е. только по eventId?

papa
02.07.2018
12:20:49
зависит от запроса. у вас нет сортировки по дате, значит вы всегда будете читать данные месяцами

может вам так и надо.

Alex
02.07.2018
12:21:33
А вынесение event_id в PKEY не сожрёт всю память?

Sergei
02.07.2018
12:23:23
А вынесение event_id в PKEY не сожрёт всю память?
не совсем тогда ясно как обеспечить replacing поведение

papa
02.07.2018
12:24:00
не должно, это же разреженный индекс.

Sergei
02.07.2018
12:28:15
Я конечно извиняюсь за повторение вопроса, но до конца понять так и не удалось ? ORDER BY - это Cassandra/Dynamo-like PKEY, по которому так же происходит merge, верно?

Tima
02.07.2018
12:34:08
ORDER BY - колонки или список колонок, по которым в MergeTree (первичный ключ): - данные всей таблицы упорядочены - создан разреженый индекс - в "слопывающихся" движках данные слопываются по этому ключу

Vladimir
02.07.2018
12:49:07
Сформулирую полный вопрос с вашего позволения. Есть CREATE TABLE XXX ... ORDER BY (appId, metricId, timestamp) SAMPLE BY (metricId); Есть запросы вида SELECT SUM(v) FROM XXX where appId=1 and metricId=1 and timestamp>YYY and timestamp<ZZZ; Для некого metricId данных может быть очень много и запрос выполняется долго. Думали прикрутить семплинг для этого SELECT SUM(v) FROM XXX SAMPLE 1/10 where appId=1 and metricId=1 and timestamp>YYY and timestamp<ZZZ Но похоже все работет не так как думалось Нужно заводить искусственную переменную sampleId значения которой равномерно будут распределены от 0 до 9 И делать так CREATE TABLE XXX ... ORDER BY (appId, metricId, sampleId, timestamp) SAMPLE BY (sampleId); Но тогда запросы без семплирования будут работать медленнее ТК мы "запохабили" немного первичный ключ, верно? Есть какой-то способ ровнее?

Alexey
02.07.2018
12:54:20
а если помимо timestamp добавить в индекс день (day Date toDate(timestamp), и дополнительно в where также указывать day, быстрее не будет?

Vladimir
02.07.2018
12:57:08
Учитывая что у нас партицирование по дням то не должно быть быстрее как я понимаю

на уровне партиции отрежется лишнее и в ключ добавлять день не надо

Вот с семплингом засада как-то после чтения документации по другому думалось оно работает, а сейччас вроде как пришло понимание а что делать непонятно

Артем
02.07.2018
13:20:26
Кто то нибудь в курсе появились ли вложенные структуры, т.е вложенность более одного уровня ? Вроде обещали эту функциональность завести в первом квартале 2018 года

Michal
02.07.2018
13:25:44
Кто то нибудь в курсе появились ли вложенные структуры, т.е вложенность более одного уровня ? Вроде обещали эту функциональность завести в первом квартале 2018 года
Кликхаус в курсе :) Лучше такие вещи у него спрашивать: CREATE TABLE xxx_nestes ( a UInt32, b Array(Array(Tuple(String, String))) ) ENGINE = Log Ok. 0 rows in set. Elapsed: 0.006 sec. :) insert into xxx_nestes values (1, [[('hello','world'),('foo','bar')],[('','')]] ); INSERT INTO xxx_nestes VALUES Ok.

papa
02.07.2018
13:29:18
Я имел ввиду структуру Nested
а чем массивы массивов не подходят?

Michal
02.07.2018
13:30:38
Вот с семплингом засада как-то после чтения документации по другому думалось оно работает, а сейччас вроде как пришло понимание а что делать непонятно
А вы посмотрите на это с другой стороны: вот у вас есть черезчур много данных. На каком основании вы предпочли бы отбросить бОльшую их часть, так чтобы их качество не ухудшилось? На основании metricID явно бессмысленно, если вы хотите для конкретной метрики данные выбирать. Т.е. берем все записи для данного metricID и обрасываем из них такую часть для которой?..

Артем
02.07.2018
13:31:10
а чем массивы массивов не подходят?
Многомерные массивы не придерживаются для таблиц типа mergetree

Google
Michal
02.07.2018
13:31:19
Я имел ввиду структуру Nested
Nested - это только syntax sugar для нескольких параллельных таблиц.

Многомерные массивы не придерживаются для таблиц типа mergetree
Извините, но кликхаус с вами не согласен :) : :) create table xxx_nestes2 ( a UInt32, b Array(Array(Tuple(String,String))) ) Engine = MergeTree ORDER BY a; CREATE TABLE xxx_nestes2 ( a UInt32, b Array(Array(Tuple(String, String))) ) ENGINE = MergeTree ORDER BY a Ok. 0 rows in set. Elapsed: 0.007 sec. :) insert into xxx_nestes2 values (1, [[('hello','world'),('foo','bar')],[('','')]] ); INSERT INTO xxx_nestes2 VALUES Ok. 1 rows in set. Elapsed: 0.002 sec.

Michal
02.07.2018
13:38:30
А что будет работать эффективнее, 2 таблицы с джоином или таблица с nested структурой)
Если данные всегда предполагается использовать совместно (т.е. те данные которые в нормальной форме были бы в правой таблице - сами по себе не используются, а только в сочетании с левой таблицей) - то по моим наблюдениям Nested / Array всегда быстрее.

Артем
02.07.2018
13:39:35
Michal
02.07.2018
13:42:16
Ну да, получется или rand()/10=0 использовать или sampleId добавлять Верно?
Ну рандом всегда остается как запасной вариант, для него в принципе и SAMPLE BY не нужен (правда результаты будут недетерминированные если этот rand не хранить физически). Но часто например можно отсеять по какому-то иному признаку, например id пользователя.

Vladimir
02.07.2018
13:43:56
timestamp%10=0 детерминированно будет, но что-то меня смущает скорости не даст, читать все равно все

Michal
02.07.2018
13:44:12
Т.е. если пользователей много (или так МНОГО), то даже если половину их выбросить статистически картина меняется мало. А вот если выбросить случайную половину событий у случайных пользователей - то характерестики данных могут пострадать.

Vladimir
02.07.2018
13:44:48
в моем случае можно случайно выбросить

Michal
02.07.2018
13:46:28
в моем случае можно случайно выбросить
Тогда может проще всего выкинуть просто определенный интервал времени? Просто заузить день? Или от каждого часа взять по 10 мин?

Vladimir
02.07.2018
13:48:06
неправильно выразился как раз каждое 10 по времени надо оставить например

допустим 100000 измерении в минуту и так 30 дней можно оставить 100 измерении в минуту но каждую минуту оставить

извините за двусмысленность

Страница 573 из 723