@clickhouse_ru

Страница 232 из 723
Alexey
13.08.2017
22:39:57
Запросы одинаковым образом используют индекс. Но сравнение date с константной проще, чем вычисление месяца.

Vladislav
13.08.2017
22:40:48
логично. Еще раз спасибо!:)

Andrey
14.08.2017
06:47:43
Подскажите, пожалуйста, по коду: вот у меня есть Block полученный от сервера, как мне его проще всего нарезать на строчки типа char**. Парсить то, что было на входе WriteBuffer?

Google
Igor
14.08.2017
08:30:46
Подскажите по session_id ( хочу в драйвере прикрутить ) и TEMPORARY TABLE - Эти таблицы можно удалить через DROP TABLE ? У меня не получается - посылаю запрос на CREATE , потом на DROP с указанием session_id - ошибка - Из доки : "- временные таблицы исчезают после завершения сессии; в том числе, при обрыве соединения" - получается нельзя использовать несколько соединений подряд с одним session_id , нужно постоянно держать connection ?

Kirill
14.08.2017
08:34:33
присоединяюсь к вопросу, т.к. при работе с нативным протоколом таже проблема, нет возможности удалять временные таблицы, а разрывать соединение каждый раз не очень удобно

Alexey
14.08.2017
08:48:11
Привет. Про LEFT JOIN. Может, кому пригодится. Вложенные запросы пришлось написать вместо просто таблиц, т.к. алиасы не работают так, как в MySQL. ✅ Так работает (вывожу регионы и страны с айдишниками): :) SELECT region_id, region_name, country_id, country_name FROM (SELECT region_id, name_ru as region_name, country_id FROM _regions_log WHERE 1=1 LIMIT 0,10) ANY LEFT JOIN (SELECT country_id, name_ru as country_name FROM _countries) USING(country_id) ORDER BY region_name LIMIT 0,10 SELECT region_id, region_name, country_id, country_name FROM ( SELECT region_id, name_ru AS region_name, country_id FROM _regions_log WHERE 1 = 1 LIMIT 0, 10 ) ANY LEFT JOIN ( SELECT country_id, name_ru AS country_name FROM _countries ) USING (country_id) ORDER BY region_name ASC LIMIT 0, 10 ┌─region_id─┬─region_name────────────┬─country_id─┬─country_name─┐ │ 2763 │ Chongqing Municipality │ 97 │ Китай │ │ 20573 │ Dornod Aymag │ 130 │ Монголия │ │ 875 │ Imo State │ 137 │ Нигерия │ │ 13330 │ Ogun State │ 137 │ Нигерия │ │ 2188 │ Pune │ 80 │ Индия │ │ 1000001 │ Адыгея │ 1 │ Россия │ │ 1000236 │ Архангельская область │ 1 │ Россия │ │ 1004118 │ Астраханская область │ 1 │ Россия │ │ 1004565 │ Башкортостан │ 1 │ Россия │ │ 1009404 │ Белгородская область │ 1 │ Россия │ └───────────┴────────────────────────┴────────────┴──────────────┘ 10 rows in set. Elapsed: 0.005 sec. Processed 3.96 thousand rows, 140.74 KB (756.70 thousand rows/s., 26.93 MB/s.) Кстати, звёздочка во внешнем селекте выводила только столбцы, соответствующие первому вложенному селекту. Перечисление всех - сработало.

А вот, с чего начал терять время на преобразования: ? Так - не работает (в отличие от MySQL): :) SELECT r.region_id as region_id, r.name_ru as region_name, r.country_id as country_id, c.name_ru as country_name FROM geodata._regions_log as r LEFT JOIN geodata._countries as c USING(country_id) WHERE 1=1 ORDER BY r.name_ru LIMIT 0,10 SELECT r.region_id AS region_id, r.name_ru AS region_name, r.country_id AS country_id, c.name_ru AS country_name FROM geodata._regions_log AS r LEFT JOIN geodata._countries AS c USING (country_id) WHERE 1 = 1 ORDER BY r.name_ru ASC LIMIT 0, 10 Received exception from server: Code: 60. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Table geodata.geodata._countries doesn't exist.. 0 rows in set. Elapsed: 0.034 sec. ? Задвоенная БД? - убираем ваще. Но и так - не работает: :) SELECT r.region_id as region_id, r.name_ru as region_name, r.country_id as country_id, c.name_ru as country_name FROM _regions_log as r LEFT JOIN _countries as c USING(country_id) WHERE 1=1 ORDER BY r.name_ru LIMIT 0,10 SELECT r.region_id AS region_id, r.name_ru AS region_name, r.country_id AS country_id, c.name_ru AS country_name FROM _regions_log AS r LEFT JOIN _countries AS c USING (country_id) WHERE 1 = 1 ORDER BY r.name_ru ASC LIMIT 0, 10 Received exception from server: Code: 47. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Unknown identifier: c.name_ru. 0 rows in set. Elapsed: 0.021 sec. Спасибо за внимание

Aloneibreak
14.08.2017
08:50:00
Добрый день. Подскажите почему не рекомендуется хранить float в таблицах?

Игорь
14.08.2017
08:51:08
0.2 + 0.1 = 0.30000000000000004

вот поэтому

Aloneibreak
14.08.2017
08:52:04
Спасибо

Andrew
14.08.2017
09:03:07
Добрый день. Обнаружил интересную особенность поведения внешних словарей CH 1.1.54245 Во всех конфигурационных файлах словарей прописаны значение параметра "Периодичность обновления для полностью загружаемых словарей": <lifetime> <min>3000</min> <max>4200</max> </lifetime> <layout> <hashed/> </layout> В основном конфиг файле config.xml СН параметр dictionaries_lazy_load не указан. Не могли бы подсказать почему внешние словари не обновляются в период, который указан в lifetime? А обновление всех словарей происходит только тогда, когда производится запрос к одному из словарей. Ошибок в логах нет. Словари висят в памяти определенное время, а потом удаляются. Заранее спасибо

Vladislav
14.08.2017
09:21:28
Здравствуйте. Никто не сталкивался с проблемой на очень маленьких данных (10 мб) — очень большое число parts в partition и следовательно размер partition в несколько раз больше (60 мб) чем данных в ней. Используем granularity 512, но когда закачивали основной сет размером в 6 гб таких проблем не получали.

Sergey
14.08.2017
10:09:01
Привет. Подскажите, как я могу сконкатенировать массивы?

Google
Alexandr
14.08.2017
10:19:32
добрый день, вопрос актуален Alexandr Bocharov, [11.08.17 15:37] при прочих равных - SummingMergeTree vs AggregatingMergeTree у какого движка будет выше производительность, лучше потребление памяти, другие ньюансы/недостатки использования? может есть бенчмарки?

Alexey
14.08.2017
10:22:41
всем привет! папака /local/zookeeper/version-2 занимает 440Gb и в ней 15к файлов. Это нормально? Почистить можно ее?

Maxim
14.08.2017
10:23:03
Привет всем. Ребят а как яндекс реализует отправку батчем в метрики, там же клик это одно событие, где они хранят события перед отправкой?

Дмитрий
14.08.2017
10:24:16
может в RAM?

Roman
14.08.2017
10:24:19
где-нибудь типа RabbitMQ?

Aleksandr
14.08.2017
10:26:20
Возможно ли использование поля из словаря в выражении WHERE? SELECT * FROM ( SELECT foo1, foo2, foo3, dictGetString('my_dict', 'dict_foo', tuple(toInt32(bar1), bar2)) FROM my_table WHERE date = '2017-05-11' ) AS t1 WHERE dict_foo != 'smth' LIMIT 10

Maxim
14.08.2017
10:26:41
у меня была идея либо в kafka, redis или просто RAM, но от мне интересно как это в яндексе устроенно

Maxim
14.08.2017
10:27:54
Движок buffer
Напишу тесты тогда для проверки

Александр
14.08.2017
10:28:07
Привет всем. Ребят а как яндекс реализует отправку батчем в метрики, там же клик это одно событие, где они хранят события перед отправкой?
На сколько я помню из рассказов о том как они кладут данные в метрике, то там был buffer в самом CH через которые эвенты сбрасываются в таблицу

Алексей не так давно рассказывал про то как этот буфер устроен и как им пользоваться. Плюсы и минусы. Если постараться, то можно в истории чатика найти )

Alexey
14.08.2017
10:38:29
всем привет! папака /local/zookeeper/version-2 занимает 440Gb и в ней 15к файлов. Это нормально? Почистить можно ее?
нашел, что A ZooKeeper server will not remove old snapshots and log files when using the default configuration. сколько посоветуете поставить autopurge.snapRetainCount и autopurge.purgeInterval? ну интервал часик например, а колво snapRetainCount?

Igor
14.08.2017
10:40:24
TDD? :)
угу он самый

Alexey
14.08.2017
10:42:29
а блин, в доке же есть

спс =)

papa
14.08.2017
11:17:34
Привет. Подскажите, как я могу сконкатенировать массивы?
SELECT [1, 2] AS x, [3, 4] AS y, arrayReduce('groupArrayArray', [x, y]) AS xy ┌─x─────┬─y─────┬─xy────────┐ │ [1,2] │ [3,4] │ [1,2,3,4] │ └───────┴───────┴───────────┘

Sergey
14.08.2017
11:34:36
Спасибо, а можно ли как-то над каждым элементом одного массива произвести изменение по какой-то функции и получить на выходе масссив: Например, ['x', 'y'] -> ['xx', 'yy'] ?

Roman
14.08.2017
11:36:02
https://clickhouse.yandex/docs/ru/single/index.html#arraymap-func-arr1

Sergey
14.08.2017
11:37:50
Спасибо, проглядел!

Google
Alexey
14.08.2017
14:21:51
Подскажите, пожалуйста, по коду: вот у меня есть Block полученный от сервера, как мне его проще всего нарезать на строчки типа char**. Парсить то, что было на входе WriteBuffer?
У столбцов (IColumn) есть метод getDataAt, который позволяет получить ссылку на кусок памяти, где расположено значение. Это работает только для простых типов. Например, для массивов уже нет. Также есть метод operator[], который позволяет получить значение в виде Field.

А вот, с чего начал терять время на преобразования: ? Так - не работает (в отличие от MySQL): :) SELECT r.region_id as region_id, r.name_ru as region_name, r.country_id as country_id, c.name_ru as country_name FROM geodata._regions_log as r LEFT JOIN geodata._countries as c USING(country_id) WHERE 1=1 ORDER BY r.name_ru LIMIT 0,10 SELECT r.region_id AS region_id, r.name_ru AS region_name, r.country_id AS country_id, c.name_ru AS country_name FROM geodata._regions_log AS r LEFT JOIN geodata._countries AS c USING (country_id) WHERE 1 = 1 ORDER BY r.name_ru ASC LIMIT 0, 10 Received exception from server: Code: 60. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Table geodata.geodata._countries doesn't exist.. 0 rows in set. Elapsed: 0.034 sec. ? Задвоенная БД? - убираем ваще. Но и так - не работает: :) SELECT r.region_id as region_id, r.name_ru as region_name, r.country_id as country_id, c.name_ru as country_name FROM _regions_log as r LEFT JOIN _countries as c USING(country_id) WHERE 1=1 ORDER BY r.name_ru LIMIT 0,10 SELECT r.region_id AS region_id, r.name_ru AS region_name, r.country_id AS country_id, c.name_ru AS country_name FROM _regions_log AS r LEFT JOIN _countries AS c USING (country_id) WHERE 1 = 1 ORDER BY r.name_ru ASC LIMIT 0, 10 Received exception from server: Code: 47. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Unknown identifier: c.name_ru. 0 rows in set. Elapsed: 0.021 sec. Спасибо за внимание
Спасибо за примеры! Это старая проблема, нам давно пора это исправить. Постепенно делаем.

Sergei
14.08.2017
14:26:51
Подскажите пожалуйста, вижок AggregatingMergeTree как-то сокращает объем таблицы и или нет? Вообще какие могут быть области его применения? Спасибо

Alexey
14.08.2017
14:27:51
Добрый день. Подскажите почему не рекомендуется хранить float в таблицах?
Никаких особенных проблем с float-ами нет кроме того, что это именно float-ы - то есть, плохо подходят для денег и в тех местах, где нужно хранить десятичные дроби без потери точности. А если нужно обрабатывать данные мониторинга, физические рассчёты, то float-ы будут в самый раз.

Dmitrii
14.08.2017
14:28:17
/stat@combot

Combot
14.08.2017
14:28:18
combot.org/chat/-1001080295593

Igor
14.08.2017
14:29:10
И правда, временные таблицы не удаляются вообще никак. Странно, что только сейчас заметили.
Я для своих задач делаю через TinyLog, и потом удаляю - а озадачился только из за примера с session_id. Мне кажется мало кто использует ее в ручном режиме, как в доки и написанно - "В большинстве случаев, временные таблицы создаются не вручную"

Vsevolod
14.08.2017
14:29:25
@milovidov_an за исключением того, что они будут шуметь и фигово компрессироваться

@milovidov_an при том, что в большинстве случаев точность даже float для всего допустимого диапазона значений не особо нужна

Vsevolod
14.08.2017
14:31:48
ну и atod/dtoa - это боль

Andrey
14.08.2017
14:31:51
У столбцов (IColumn) есть метод getDataAt, который позволяет получить ссылку на кусок памяти, где расположено значение. Это работает только для простых типов. Например, для массивов уже нет. Также есть метод operator[], который позволяет получить значение в виде Field.
Спасибо. Мне, в принципе, все равно данные форматировать надо, по этому я пытаюсь Воспользоваться WriteBuffer. Постгрес воспринимает данные через их текстовое представление.

Alexey
14.08.2017
14:32:08
Добрый день. Обнаружил интересную особенность поведения внешних словарей CH 1.1.54245 Во всех конфигурационных файлах словарей прописаны значение параметра "Периодичность обновления для полностью загружаемых словарей": <lifetime> <min>3000</min> <max>4200</max> </lifetime> <layout> <hashed/> </layout> В основном конфиг файле config.xml СН параметр dictionaries_lazy_load не указан. Не могли бы подсказать почему внешние словари не обновляются в период, который указан в lifetime? А обновление всех словарей происходит только тогда, когда производится запрос к одному из словарей. Ошибок в логах нет. Словари висят в памяти определенное время, а потом удаляются. Заранее спасибо
dictionaries_lazy_load по-умолчанию true. В этом случае, первая загрузка словарей происходит при первом обращении к ним. После этого словари обновляются согласно указанному времени (в вашем случае примерно каждый час с разбросом в +- 10 минут). Вы говорите, что словари исчезают? Такого поведения конечно быть не должно. Как это видно? Также отмечу, что словари не перезагружаются, если можно определить, что источник не изменился (не увеличилось время модификации файла, время модификации MyISAM таблицы).

добрый день, вопрос актуален Alexandr Bocharov, [11.08.17 15:37] при прочих равных - SummingMergeTree vs AggregatingMergeTree у какого движка будет выше производительность, лучше потребление памяти, другие ньюансы/недостатки использования? может есть бенчмарки?
SummingMergeTree несколько (чуть-чуть) оптимальнее - по скорости мержа, и по скорости выполнения запросов. Если вам нужны только суммы, то он проще в использовании.

Alexandr
14.08.2017
14:35:54
спасибо.

Alexey
14.08.2017
14:37:39
Привет всем. Ребят а как яндекс реализует отправку батчем в метрики, там же клик это одно событие, где они хранят события перед отправкой?
Как ни странно, для основного кластера мы не используем Buffer таблицы. В движок Метрики приходят данные уже в виде пачек, а эти пачки образуются для разных потоков данных одним из двух способов: - накапливаются в файлах на неких серверах, которые принимают трафик; - кладутся и вынимаются из Кафки.

Возможно ли использование поля из словаря в выражении WHERE? SELECT * FROM ( SELECT foo1, foo2, foo3, dictGetString('my_dict', 'dict_foo', tuple(toInt32(bar1), bar2)) FROM my_table WHERE date = '2017-05-11' ) AS t1 WHERE dict_foo != 'smth' LIMIT 10
Можно. Для этого, задайте в подзапросе алиас для выражения, которое достаёт данные из словаря. И используйте это имя в условии снаружи.

Google
Alexey
14.08.2017
14:39:18
Подскажите пожалуйста, вижок AggregatingMergeTree как-то сокращает объем таблицы и или нет? Вообще какие могут быть области его применения? Спасибо
AggregatingMergeTree агрегирует данные при мержах. То есть, если было много строк для одного ключа, то после мержа останется одна, агрегированная. Мержи производятся не для всех кусков сразу - данные постоянно держатся несколько недомерженными.

Andrey
14.08.2017
14:55:05
Тогда смотрите метод IDataType::serializeTextEscaped и похожие.
Да, я так и сделал. Мне по сути нужно из строки char**. Я просто \t заменил на 0 и собрал указатели (через WriteBufferFromOStream+stringstream), но что-то пошло не так, завтра буду разбираться.

Andrey
14.08.2017
14:58:36
Ну, я сейчас делаю PoC чтобы сравнить скорость python+http с plainC+native

Admin
ERROR: S client not available

Andrey
14.08.2017
14:59:05
Если от С будет выхлоп - буду делать хорошо и правильно

Vladislav
14.08.2017
16:17:12
Много не active партов и они не удаляются уже в течении продолжительного времени...
Точнее, видимо, парты постоянно создаются. Их число скачет в районе 90 штук.

Тефтеля
14.08.2017
16:40:19
В кх вставки по 20к лучше делать? или можно больше?

Тефтеля
14.08.2017
16:41:55
можно то можно) а оптимально как?

Vladimir
14.08.2017
16:42:25
можно то можно) а оптимально как?
Чтоб самих инсертов было мало

А размер одного инсерта был большой

Alan
14.08.2017
18:58:15
а чем буферизируют в golang ? или вручную?

Alex
14.08.2017
19:04:37
а чем буферизируют в golang ? или вручную?
Я к примеру просто собираю в слайс, после чего просто проверяю длинну + тикер на каждые две секунды. Т.е. или инсерт идёт при достижении 10к, или каждые две секунды

Roman
14.08.2017
19:14:01
есть еще https://github.com/nikepan/clickhouse-bulk

Alex
14.08.2017
19:14:13
Из самых годных вариантов как по мне - это обойтись возможностями клик хауса https://clickhouse.yandex/docs/ru/table_engines/buffer.html

Alan
14.08.2017
19:44:03
там написано что даже в буффер лучше слать пачками

Google
Roman
15.08.2017
05:22:16
/stat@combot

Combot
15.08.2017
05:22:16
combot.org/chat/-1001080295593

Dmitriy
15.08.2017
08:56:00
Привет Всем. Подскажите такой вопрос как можно обрывать выполнения запроса в случае если запрос приходит через http но соединение периодически обрывается? т.е. у нас получается что запрос запустился а сооединение отвалилось а запрос остался выполнятся. фигня в том что кол. данных которые перебирается уже большое и из-за таких обрывов растет загрузка на сервере и соответственно время выполнение запросов.

Евгений
15.08.2017
10:20:49
Скажите, пожалуйста, а можно как-то повлиять на количество parts, при превышении которого КХ начинает кидаться ошибкой "Code: 252, e.displayText() = DB::Exception: Too much parts. Merges are processing significantly slower than inserts."?

Евгений
15.08.2017
10:26:00
медленнее лить.) Это означает что мержи неуспевают за инсертами
Проблема в том, что даже если ничего не лить, это количество сейас около 300. OPTIMIZE TABLE с FINAL отрабатывает моментально и ничего не делает. Вероятно это из-за того, что выполняю ее на не ведомой реплике. Но на лидирующей количество в 4 раза меньше. Проверил все варианты о которых писали, откуда такое может идти, ни одно не потвердилось. Мне бы сейчас потушить эту проблему и нормально разбраться.

Евгений
15.08.2017
10:27:52
А как этот параметр называется?

Диана
15.08.2017
12:39:30
Подскажите, пожалуйста, с помощью чего просуммировать математически элементы Array(UInt64), sumArray как я поняла, предназначен ля агрегации

papa
15.08.2017
12:44:33
arrayReduce

Aleksandr
15.08.2017
12:47:05
Привет всем! Кто-нибудь делал импорт в CH из Parquet файлов?

Диана
15.08.2017
12:50:39
спасибо большое

Alexey
15.08.2017
12:52:06
А как этот параметр называется?
Ограничение на максимальный размер куска - max_bytes_to_merge_at_max_space_in_pool. Настраивается в config.xml, в секции merge_tree. Количество кусков, после которого кидается исключение о том, что кусков слишком много - parts_to_throw_insert. Обычно увеличивать не имеет смысла, так как причина часто не в том, что куски не успевают мержатся, а в том, что они не мержатся вообще, из-за каких-либо проблем.

Евгений
15.08.2017
12:53:04
Спасибо!

Aleksandr
15.08.2017
12:56:12
Встроенного конвертера из Parquet нет, а очень бы хотелось сделать, только не очень понятно в какой формат делать конвертацию? В Native? это самый "родной" формат для CH и самый дешевый для импорта?

Alexey
15.08.2017
12:57:28
Да, Native самый оптимальный. Но его труднее сформировать вручную. Второй по простоте - RowBinary. Хотя сам Parquet больше всего похож на Native, и я думаю, что родную поддержку Parquet рано или поздно придётся сделать.

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