
Vladimir
03.07.2017
10:50:04
https://en.wikipedia.org/wiki/IEEE_754
вот там подробнее
если очень вкратце - то в памяти у тебя записывается экспонента и мантиса и по ним число восстанавливается, но есть некоторые особенности такого.
уши проблемы растут от того что double это мантиса * 2^порядок

Google

Дмитрий
03.07.2017
10:55:03
вопрос не в том, как Float хранится в памяти, а в том, что функция преобразования строки парсит неправильно

Fike
03.07.2017
11:20:37
Что конкретно неправильно? То, что строковое представление не возвращается обратно в 1516.13?

Дмитрий
03.07.2017
11:29:13

Fike
03.07.2017
11:34:46
если работаете с деньгами (и если я не пропустил введение decimal в кликхаус), то это, наверное, самый правильный путь

Vladimir
03.07.2017
11:39:30
все верно

papa
03.07.2017
11:42:55
видимо потому что в данном случае toFloat64(x) != toFloat64(toString(x))

Дмитрий
03.07.2017
11:43:38
Я, наверное, перефразирую, скорее вопрос не в том, как КХ парсит числа с плавающей точкой, а на сколько вообще точны арифметические операции, а дальше и аналитеческие функции. И, если заходить глубже, возможно ли использовать КХ для аналитики с большой чувствительности к отклонениям

papa
03.07.2017
11:43:59
хотя казалось бы разбор float64 строки "из запроса" и "из строки" должен вести себя одинаково.

Дмитрий
03.07.2017
11:44:08

papa
03.07.2017
11:44:39

Дмитрий
03.07.2017
11:44:52
ну, то есть, округлять?

Google

Vladimir
03.07.2017
11:45:17
на котором впрочем базируется большая часть вещественной арифметики, включая научной

papa
03.07.2017
11:46:00
судя по тому, что во всех ваших примерах с плавающей точкой два знака после запятой, это деньги. float32/64 не надо использовать для арифметики с деньгами, они не для этого. как и в любом языке программирования и в любой другой бд.

Igor
03.07.2017
11:47:36
а в чем проблема использовать их для денег при условии 7 знаков после запятой?

Vladimir
03.07.2017
11:47:53

Дмитрий
03.07.2017
11:50:04

Vladimir
03.07.2017
11:50:27

papa
03.07.2017
12:03:58
https://stackoverflow.com/a/3730040
что, впрочем, не отменяет вопрос про x!=toFloat64(toString(x))

Александр
03.07.2017
12:22:57

Fike
03.07.2017
12:28:22

Vladimir
03.07.2017
14:20:33
Добрый день. Привет из Минска всем. Пропустил митап, увидел только 30 блин. Надеюсь наверстать тут и в мэйлнг листе.
Может кто по доброте душевной ответит, прольет свет тут на некоторые вопросы, буду примного благодарен.
https://groups.google.com/forum/#!topic/clickhouse/xzlFiMBIhi4

Alexander
03.07.2017
15:30:50
Хотел спросить для понимания: а в чём причина гедетерминированности anyLast - в том что выбирается одно значение из нескольких потоков? Пишется в mergetree оно тоже произвольно?

papa
03.07.2017
15:32:39
так более оптимально.jpg
пишется в mergetree?

Alexander
03.07.2017
15:38:45
Если бы я все до одного потока сократил - anylast стал бы нормальным last? :)

Alexey
03.07.2017
15:40:58
В случае одного потока, данные читаются в порядке кусков таблицы, а в каждом куске - в порядке первичного ключа. Но не стоит на это закладываться.

Alexander
03.07.2017
15:44:41
Просто argMax довольно тяжёлой операцией выглядит. Надо как минимум дополнительное поле читать. При уверенности если пишется в mergetree складывается в нужной последовательности, то можно было бы этого избежать.
Не пойму как другие anyLast или просто any используют. Например получить последнюю цену.

papa
03.07.2017
15:52:08
иногда две колонки связаны зависимостью, но при этом не хочется тащить вторую колонку в group by, а заселектить надо. иногда действительно все равно какое значение заселектится.

Google

Alexander
03.07.2017
16:01:21
Ещё вопрос: поставил uncompressed cache: 20gb. Но virt/res клик-хаус занимает 400/113mb. А где кеш? Хотя вроде все загружено. Или я чего-то не дополнял где он должен быть виден.

Igor
03.07.2017
16:34:02
Подскажите, а можно как-то схлопнуть rows в массив? ( плоховато у меня с array )
Пример таблица :
| datetime | some_id | value |
Если сгруппировать по some_id получить массив из [ value от первого datetime, value от второго datetime, и т/д ]

papa
03.07.2017
16:34:39
groupArray?

Igor
03.07.2017
16:38:22

Alexander
03.07.2017
17:09:28
Вопрос: возможна потенциально какая-то блокировка сессии юзера? Например запрос в одной сессии, но нитки занимаются аггрегацией запроса другого юзера.
И очередной вопрос: а что есть для аналитиков кроме tabix?

Igor
03.07.2017
17:54:05
если речь про дашборды то superset хорош и дружит с кликхаузом

Alexey
03.07.2017
17:54:06

Igor
03.07.2017
18:08:53

Evgeny
03.07.2017
18:13:59

Mike
03.07.2017
18:16:21

Igor
03.07.2017
18:21:51

Igor
03.07.2017
18:21:57
Коллеги, а с отрицательными Enum'ами ни у кого проблем не было? Почему то фейлится запрос и не пойму почему.
SELECT *
FROM orders
WHERE Status = 'REFUND'
Received exception from server:
Code: 49. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Unknown element 'REFUND' for type Enum8('REFUND' = -2, 'ERROR' = -1, 'INCOMPLETE' = 0, 'SUCCESS' = 1).
UPD: решено вот так: select * from adguard.orders WHERE toInt8(Status)=-2

Mike
03.07.2017
18:22:50


Alexey
03.07.2017
18:25:33
Коллеги, а с отрицательными Enum'ами ни у кого проблем не было? Почему то фейлится запрос и не пойму почему.
SELECT *
FROM orders
WHERE Status = 'REFUND'
Received exception from server:
Code: 49. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Unknown element 'REFUND' for type Enum8('REFUND' = -2, 'ERROR' = -1, 'INCOMPLETE' = 0, 'SUCCESS' = 1).
UPD: решено вот так: select * from adguard.orders WHERE toInt8(Status)=-2
Не получилось воспроизвести:
:) CREATE TABLE test.enum (x Enum8('REFUND' = -2, 'ERROR' = -1, 'INCOMPLETE' = 0, 'SUCCESS' = 1)) ENGINE = Memory
CREATE TABLE test.enum
(
x Enum8('REFUND' = -2, 'ERROR' = -1, 'INCOMPLETE' = 0, 'SUCCESS' = 1)
) ENGINE = Memory
Ok.
0 rows in set. Elapsed: 0.007 sec.
:) INSERT INTO test.enum VALUES ('REFUND'), ('SUCCESS')
INSERT INTO test.enum VALUES
Ok.
2 rows in set. Elapsed: 0.012 sec.
:) SELECT * FROM test.enum WHERE x = 'REFUND'
SELECT *
FROM test.enum
WHERE x = 'REFUND'
┌──────x─┐
│ REFUND │
└────────┘
1 rows in set. Elapsed: 0.009 sec.


Igor
03.07.2017
18:25:56
у меня вот тоже на новой таблице не вышло. пока мучаю.

Alexander
03.07.2017
18:52:07

Google

Alexander
03.07.2017
20:03:13
Значение поставил, в .settings почему-то changed. Но памяти по-прежнему ест только 400мб

Alexey
03.07.2017
20:32:39
changed - значит было указано явно в конфиге или изменено. То есть, не умолчание.
И ещё есть настройка merge_tree_max_rows_to_use_cache,
которая отключает кэш для не слишком мелких запросов (защищает от вымывания кэша)
По-умолчанию всего лишь миллион строк. Чтобы кэш использовался на всех запросах, следует поставить в большое значение.

Alexander
03.07.2017
20:39:44
Миллион - из таблицы или пользователю?
Таблица 500млн
Получается надо туда хотя бы 150млн поставить. Ок

Alexey
03.07.2017
20:41:44

Alexander
03.07.2017
20:43:16
Извиняюсь - это для config или для юзера настройка?

Alexey
03.07.2017
20:43:28
Для юзера.

Alexander
03.07.2017
20:50:28
Спасибо, заработало. Прибавка не в разы конечно, но на некоторых запросах до 1.5 раз
Но опять же maxArg выжирает много.

Igor
03.07.2017
21:17:01
Про проблемы с негативными енумами - пардон, ложная тревога, ошибка в коде создания таблицы (в значения енума при сериализации попадал какой-то непечатный символ, который не было видно describe/show create).

Alexander
03.07.2017
21:19:35
получается это 1/2 шага к закреплению самых актуальных данных в памяти. наверное 1) закрепить теоретически легко, но 2) тут замедляет копирование в user-space (судя по google-groups) 3) чтоб получить эти данные в памяти надо проходить полный цикл: запись/чтение/декомпрессия.


Kirill
04.07.2017
05:49:02
А подскажите, что хотелось бы в tabix, и чего не хватает?
Интересно, т.к рисую роадмап себе на будущее
Привет. Отличный вроде UI и время от времени использую но постоянно замечаю что скатываюсь в CLI. Даже когда запросы большие, все равно пишу их в какой нибудь десктопной IDE (idea, sublime) и потом вставляю в CLI.
0. Сделать персистентные проекты не в JS сессии, а в самом кликхаусе. Есть же отличное место для хранения, чего бы не использовать :) При сохранении проекта указывать базу и префикс таблиц. Там хранить все настройки, табы, логи, сохраненные запросы и графики. Что бы из любого места можно было получить тот же проект в том же самом месте где его оставил на другом браузере.
1. Задержка которая там после того как уже кликнул мышкой на место в запросе и до того как уже можно начинать писать текст - очень некомфортная. Даже после отключения автокомплита. Если можно сделать быструю смену между простым режимом, без задержки, и красивым режимом с тормозами, но автокомплитом, подсветкой, строками и форматированием - было бы круто. После 500го запроса автокомплит уже не нужен, а задержка все еще мешает :) Задержка, мигание экрана и анимация между переходами по табам тоже раздражает, но я не знаю если это лечится.
2. В CLI можно несколько раз кликнуть вверх и получить запрос который был 3 запуска назад - используется постоянно. В табикс есть "query log", и есть request's log - но они оба странные и не решают задачу полностью. request log не по табу, а вообще по всей системе, а "query log" - я так и не понял как пользоваться. Ну и конечно доступ в 2 и более кликов мышкой - это совсем не так эффективно как из CLI
3. Логичное продолжение аналитической части - сохранять запросы с их выбранной визуализацией (таблица, график) отдельно с возможностью расшарить.
3.0 Добавить возможность обьединять их в дашбоарды. Query -> SavedSlice, Slices -> Dashboard
3.1. Сохранять последний набор данных для Slice, так что бы при открытии график сразу показывался. Таким образом ссылка на дашбоард будет открываться всегда с красивыми графиками. Перезапуск требуется далеко не во всех случаях и может быть совсем не часто.
3.2 Для запросов ввести параметризацию с дефолтами. Так что бы из редактора выполнянлись дефолтные значения, а из slice или dashboard эти значения переписывались текущими для дашбоарда. В итоге получатся интерактивные дашбоарды когда меняя параметр можно будет обновить сразу весь дашбоард. И для расшаренных slice пользователь без возможности (или способности) редактировать код сможет поиграть с параметрами.
Независимо от того будут эти хотелки реализованы или нет, спасибо за работу! По ощущениям - получается отличный продукт.


Igor
04.07.2017
05:51:37
Привет. Отличный вроде UI и время от времени использую но постоянно замечаю что скатываюсь в CLI. Даже когда запросы большие, все равно пишу их в какой нибудь десктопной IDE (idea, sublime) и потом вставляю в CLI.
0. Сделать персистентные проекты не в JS сессии, а в самом кликхаусе. Есть же отличное место для хранения, чего бы не использовать :) При сохранении проекта указывать базу и префикс таблиц. Там хранить все настройки, табы, логи, сохраненные запросы и графики. Что бы из любого места можно было получить тот же проект в том же самом месте где его оставил на другом браузере.
1. Задержка которая там после того как уже кликнул мышкой на место в запросе и до того как уже можно начинать писать текст - очень некомфортная. Даже после отключения автокомплита. Если можно сделать быструю смену между простым режимом, без задержки, и красивым режимом с тормозами, но автокомплитом, подсветкой, строками и форматированием - было бы круто. После 500го запроса автокомплит уже не нужен, а задержка все еще мешает :) Задержка, мигание экрана и анимация между переходами по табам тоже раздражает, но я не знаю если это лечится.
2. В CLI можно несколько раз кликнуть вверх и получить запрос который был 3 запуска назад - используется постоянно. В табикс есть "query log", и есть request's log - но они оба странные и не решают задачу полностью. request log не по табу, а вообще по всей системе, а "query log" - я так и не понял как пользоваться. Ну и конечно доступ в 2 и более кликов мышкой - это совсем не так эффективно как из CLI
3. Логичное продолжение аналитической части - сохранять запросы с их выбранной визуализацией (таблица, график) отдельно с возможностью расшарить.
3.0 Добавить возможность обьединять их в дашбоарды. Query -> SavedSlice, Slices -> Dashboard
3.1. Сохранять последний набор данных для Slice, так что бы при открытии график сразу показывался. Таким образом ссылка на дашбоард будет открываться всегда с красивыми графиками. Перезапуск требуется далеко не во всех случаях и может быть совсем не часто.
3.2 Для запросов ввести параметризацию с дефолтами. Так что бы из редактора выполнянлись дефолтные значения, а из slice или dashboard эти значения переписывались текущими для дашбоарда. В итоге получатся интерактивные дашбоарды когда меняя параметр можно будет обновить сразу весь дашбоард. И для расшаренных slice пользователь без возможности (или способности) редактировать код сможет поиграть с параметрами.
Независимо от того будут эти хотелки реализованы или нет, спасибо за работу! По ощущениям - получается отличный продукт.
Спасибо за фидбек ! Ценные идеи !


Vladislav
04.07.2017
05:53:22
Чем то на metabase похоже становится, по хотелкам... Довольно не плохо, да ??

Дмитрий
04.07.2017
06:33:50
Привет. Начну с простых вопросов, ответы на которые плохо гуглятся в документации.
Есть легальный способ посмотреть детальный план выполнения запроса в ClickHouse?

Андрей Михайлович
04.07.2017
06:35:05

Google

Aleksander
04.07.2017
06:35:38
Привет, а нет ни у кого проблемы после обновления докера, при раскатке стандартное имейджа CH он падает, с ошибкой (2017.07.03 18:30:26.705489 [ 1 ] <Error> Application: Net Exception: Cannot assign requested address: [::1]:8123)? Интересно, почему вайлдкард для ipv6

Дмитрий
04.07.2017
06:36:04
есть

Aleksander
04.07.2017
06:36:34
Что нужно сделать, чтобы стартануть? Переписать имейдж под себя?

Дмитрий
04.07.2017
06:36:54
откатить докер до 17.04, в 17.06 явно какие-то проблемы с ipv6

Aleksander
04.07.2017
06:37:08
Ну елы палы =)
Ладно - попробуем

Дмитрий
04.07.2017
06:38:05
Это не всё. Откат в лоб не помогает, ещё пришлось дописать вот такие строки в конфиги докер демона:
"fixed-cidr-v6" : "2001:3984:3989::/64",
"ipv6" : true

Aleksander
04.07.2017
06:39:47
Спасибо, попробую

Дмитрий
04.07.2017
06:59:46
Привет. Начну с простых вопросов, ответы на которые плохо гуглятся в документации.
Есть легальный способ посмотреть детальный план выполнения запроса в ClickHouse?
так вот, про план. Его от хорошей жизни не начинают искать.
есть два простых запроса, которые процессят разное кол-во строк:
select * from table where timestamp >= toDateTime('2017-07-03 18:21:55') -- Processed 2.49 million rows
select * from (select * from table) where timestamp >= toDateTime('2017-07-03 18:21:55') -- Processed 4.97 million rows
фильтр времени для экспериментов выбран примерно на avg(timestamp)
если не срезать вложенные запросы каким-нибудь фильтром заранее, начинает процесситься вся таблица, и от этого становится больно использовать огромные сложные вьюхи, т.к. окончательные фильтры обычно попадают в конец запроса.
Есть Issue на эту тему, или какой-нибудь способ сделать кликхаус быстрым снова?

Kirill
04.07.2017
07:00:24

Дмитрий
04.07.2017
07:00:47
штука с логами меня устроит, спасибо!

Vladimir
04.07.2017
07:01:03
просто на уровне debug/trace логов будет очень много

Kirill
04.07.2017
07:02:11
пока нет Explain - это всё что есть )

Vladimir
04.07.2017
09:04:03
Ни у кого никаких идей относительно https://groups.google.com/forum/#!topic/clickhouse/xzlFiMBIhi4 ?
Хоть в правильную сторону думаю делать?