
Igor
31.03.2017
13:58:42
нет, timestamp не может быть использован в качестве обязательного поля EventDate, если у вас это timestamp с временем. я выше ответил - MergeTree разбивает данные по месяцам самостоятельно для эффективности работы.
вашим языком, шардирует данные помесячно, локально, по директориям, и потом, когда вы делаете запросы, вы указываете диапазон нужных дат (собрать стату за январь например). и он читает только данные за январь, остальные данные ваще никак не трогает.
я выше описал, как можно поступить, если есть timestamp, но нет date )

Maksim
31.03.2017
14:00:01
афигеть
да я понял на счет этого поля. могли бы вы пояснить на счет конструкции и вопросов по ней? а то я в неком замешательстве )

Stepan
31.03.2017
14:02:32

Google

Igor
31.03.2017
14:04:45

Pavel
31.03.2017
14:42:59
Добрый день. Есть таблица user_properties с набором полей uuid, createdAt, name, age, region. В эту таблицу вносятся пользователи (их свойства). И вот теперь я хочу извлечь по каждому пользователю последние правки (то есть строку со всеми значениями столбцов, которая добавлялась последней)
Хотел попробовать это сделать с использованием limit N by.
Написал такой запрос:
select uuid, createdAt, name, age, region from user_properties order by createdAt limit 1 by uuid
Но при выполнении падает сам сервер БД (докер контейнер останавливается), что как-то странно. В таблице всего 4 строки.
ClickHouse server version 1.1.54189
Привет! А вы можете прислать эти четыре строки? Можно в личку.

Felixoid
31.03.2017
14:45:49

Maksim
31.03.2017
15:21:02

Igor
31.03.2017
15:21:55
>_>
нет
аргументами после указания движка MergeTree указываются столбцы (или выражения), имеющиеся в таблице, по которым надо строить индекс, условия для семплирования и прочую фигню
предположим, у вас есть таблица с полями
EventDate, EventTimestamp, UserID, CounterID, URL, Referer
UserID - это столбец в таблице, intHash32(UserID) - условие для семплирования
> Движок принимает параметры: имя столбца типа Date, содержащего дату; выражение для семплирования (не обязательно); кортеж, определяющий первичный ключ таблицы; гранулированность индекса. Пример:

Maksim
31.03.2017
15:27:28
а то есть поле с датой, потом первичные ключи и значение граниулирования индекса

Igor
31.03.2017
15:27:38
дя

Maksim
31.03.2017
15:27:41
пропустил видимо этот кусок контекста

Vladislav
31.03.2017
15:27:55
заметил ошибку при выборке семпированных данных:
SELECT count(*)
FROM apps_clickstream_local
SAMPLE 1 / 100
Received exception from server:
Code: 10. DB::Exception: Received from /server/:9000, ip. DB::Exception: Not found column cityHash64(device_id) in block. There are only columns: app_name, os_name, device_id, event_time.

Maksim
31.03.2017
15:28:25
спасибо игорь вы прям гуру)) очень сильно мне помогли пойду воевать и загружать данные) большущее спасибо

Igor
31.03.2017
15:28:25
а если count()?

Google

Vladislav
31.03.2017
15:28:40
то же самое

Igor
31.03.2017
15:28:45

Maksim
31.03.2017
15:29:17

Stepan
31.03.2017
15:45:45
конкретно для данной опции надо рестартить, к сожалению
Спасибо, к сожалению, не помогло, все та же Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = No thread available, e.what() = No thread available
Какая-то часть словарей (12) прогружается, а на остальных вот такая ошибка, печально...

Felixoid
31.03.2017
15:56:36

Stepan
31.03.2017
15:57:44
Ага, проверял, именно те 110, что прописал в users.xml

evervoid
31.03.2017
16:00:55
Всем привет! Как сейчас обстоят дела с поддержкой NULL в таблицах? Можно ли где-то вообще следить за новостями разработки?

Alexey
31.03.2017
16:01:42

Stepan
31.03.2017
16:02:38
Есть какие-то ограничения на количество словарей в одном файле? (нет, ну мало ли..)

Shine
31.03.2017
16:11:08

evervoid
31.03.2017
16:12:00
Спасибо! А нет какого-нибудь блога/твиттера для анонсов?

papa
31.03.2017
16:19:52
changelog.md

Alexey
31.03.2017
16:43:46

Stepan
31.03.2017
16:45:47
Да, именно там

Alexey
31.03.2017
16:46:12
А как в точности там написано?

Stepan
31.03.2017
16:48:38
Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = No thread available, e.what() = No thread available
Я чуть позже проверю всю сотню словарей, может ошибка в одном как-то (может где-то не на int ссылается или еще что) аффектить другие?

Maksim
31.03.2017
17:07:09
а если count()?
Скажи пожалуйста. а автоинкремент поле как в clickhouse создать ?

Dmitry
31.03.2017
17:08:20
Никак

Maksim
31.03.2017
17:08:57
а почему его нету?

Google

Pavel
31.03.2017
17:09:59
а зачем?
мне кажется это убьет всю идею распределенности CH

Dmitry
31.03.2017
17:10:17
Тут есть нескоько ответов:
Во первых КХ распределенная БД, поэтому пришлось бы как-то синхронизировать счетчик между хостами

Pavel
31.03.2017
17:10:21
автоинкремент - поганая вещь
во-вторых, вы можете эмулировать это на Kafka.

Dmitry
31.03.2017
17:10:54
Во вторых в КХ он не нужен, т.к. нету уникального PK

Pavel
31.03.2017
17:10:54
и вставлять номера сообщений, если так хочетс как обычное поле

Maksim
31.03.2017
17:13:26
я понял спасибо)
а null по default как установить ?
подскажите плиз decimal(16,8) mysql какой тип выбрать в clickhouse ?
float32 ?

Вася
31.03.2017
17:54:22
String надёжнее всего.

Maksim
31.03.2017
18:12:43
чем надежнее? просто я так понимаю string намного больше места занимает

Igor
31.03.2017
18:21:43

Maksim
31.03.2017
18:25:46

Igor
31.03.2017
18:25:52
ну это же float
с 13.37 я утрировал, конечно
конечно, может

Maksim
31.03.2017
18:26:15
вроде должно быть норм

Google

Igor
31.03.2017
18:26:44
ну а строка она и есть строка, че ей будет
хотя, если в разных кодировках их запихивать, то да, тоже ничего хорошего

Maksim
31.03.2017
18:26:56
блин
поменяю на string

Igor
31.03.2017
18:27:49
а прям обязательно значения после запятой?
просто, например, в случае с баблом (рублями там) можно домножать на 100 и хранить в Int'е в копейках

Maksim
31.03.2017
18:29:48

Igor
31.03.2017
18:30:26
эээммм
если вы храните данные в String, то нет, с ними ничего не будет плохого
если во Float32/Float64 - то возможна потеря точности
так же, как в языках программирования, субд и прочих штуках
на примере:
:) create table floats_are_bad (x Float32) ENGINE = Memory;
:) insert into floats_are_bad values (123.456), (1234567.8901234), (9999999.9999)
:) select * from floats_are_bad
┌─────────x─┐
│ 123.456 │
│ 1234567.9 │
│ 10000000 │
└───────────┘

Maksim
31.03.2017
18:33:33
блин
у меня decimal(16,8)
там сумма написана
какой тип использовать ?

Вася
31.03.2017
18:34:45
Я прошу прощения за неудачный сарказм. Не надо хранить в String. Если нужна абсолютная точность, умножьте на десять в нужной степени и храните в Int64. Главное чтобы не переполнилось.

Igor
31.03.2017
18:34:49
ну грустно, что. можете разбить на два инта - до запятой и после запятой.
можете хранить в String, но тогда потеряете возможность эффективно считать всякие суммы и прочее. надо будет строку конвертировать во float (привет, потеря точности), и над ней уже делать агрегацию

Maksim
31.03.2017
18:39:20
а если одно поле то какое решение в моем случае? мне нужно будет считать sum по этим полям decimal

Vladislav
31.03.2017
18:40:56
хранить x * 100000000
в int64
и каждый раз не забывать умножать/делить :)

Maksim
31.03.2017
19:15:02
не понял

Google

Maksim
31.03.2017
19:15:06
так int это ведь целое число
и почему float как тип с плавающей запятой хуже int ?

papa
31.03.2017
19:25:14
https://www.google.ru/search?q=почему+нельзя+хранить+деньги+в+float

Maksim
31.03.2017
19:30:14
мы используем decimal в mysql он точно отображает сумму. в clickhouse я так понял аналога такому типу нету. соответственно единственное решение int как вы описываете, но не пойму как int может быть не целым. ведь это целочисленный тип

papa
31.03.2017
19:34:26
в этом случае можно хранить миллионные доли копеек, если они у вас целое чисило.

Maksim
31.03.2017
19:47:52

papa
31.03.2017
19:49:00
123.456 => 123456000

Maksim
31.03.2017
19:50:18

Igor
31.03.2017
19:50:47
постоянно умножаете и делите на одно и то же число
на 10000000 там, или сколько надо

Maksim
31.03.2017
19:54:42
я понял вас спасибо)
а индексы для MergeTree
они тут?

Igor
31.03.2017
19:55:48
дя

Maksim
31.03.2017
19:56:27
ну сча я наэспериментирую )) подключил драйвер создам заново схему. я так понял лучше использовать string для строк?

papa
31.03.2017
19:56:39
индекс один, в остальном да.

Maksim
31.03.2017
19:56:42
или FixedString(70) пойдет?

Igor
31.03.2017
19:57:37
ну если поместится в 70 символов то пойдёт
не поместится - печалька
+ зпдолбаетесь NUL-байты убирать

papa
31.03.2017
19:57:53
FixelString обычно для блобов фиксированного размера используется.

Maksim
31.03.2017
19:58:25
я почему его выбрал. хотел уменьшить размер базы. за счет ограничения длины