@clickhouse_ru

Страница 675 из 723
Alexander
26.09.2018
13:55:15
Подкажите, пожалуйста, с какой версии появилось это: `SELECT * FROM odbc('DSN=connection', 'table')` Это есть на сайте Альтинити, но нет в документации

Tima
26.09.2018
13:58:13
Друзья, помогите решить проблемку: Есть материалайзед вьюха CREATE MATERIALIZED VIEW defult.users ENGINE = ReplacingMergeTree PARTITION BY tuple() ORDER BY (subjectId) POPULATE AS SELECT subjectId, min(if( eventType = 'user/added', timestamp, null )) as createdAt, anyLast(if( eventType = 'user/updated', timestamp, null )) AS updatedAt FROM ( SELECT subjectId, eventType, timestamp, event FROM default.events WHERE eventType in ('user/added', 'user/updated') ORDER BY timestamp ) GROUP BY subjectId если сделать запрос из вьюхи - то возвращается один элемент, если селект по вьюхе, то user_282a1503-918a-4854-b064-169a5b2fb2b9 null 2018-09-26 13:27:49 user_282a1503-918a-4854-b064-169a5b2fb2b9 2018-09-17 17:05:05 2018-09-17 17:18:42 т.е. дедубликация не сработала. Конечно в доке написано что реплейсинг сделан для экономии места, но неужели нет возможности хоть сколько нибудь гарантировать отсутствие повторов? Связанная с этим проблема - что нельзя дать доступ к обычной вьюхе не давая доступа к оригинальной табличке - это можно как то обойти?
Напрямую никак. Можно сделать вьюху поверх матвьюхи, и в этой вьюхе сделать что-то типа SELECT * FROM defult.users FINAL Тогда будет гаранития, что не будет дублей. И отдельная таблица-вьюха

Kirill
26.09.2018
14:06:54
Напрямую никак. Можно сделать вьюху поверх матвьюхи, и в этой вьюхе сделать что-то типа SELECT * FROM defult.users FINAL Тогда будет гаранития, что не будет дублей. И отдельная таблица-вьюха
О, это интересно. Но есть еще одна проблема с этим - почему то матвьюха добавила элемент который потерял createdAt (будто селект отработал на части только). отсюда последний элемент на самом деле неправильный мерж - откуда такое поведение?

Tima
26.09.2018
14:08:35
Потому что матвьюха работает так: 1. идет инсерт данных в исходную таблицу 2. КХ выполняет запрос матвьюхи над ВСТАВЛЯЕМЫМИ данными 3. результат вставляет в матвьюху Насчёт createdAt не понял, нужно больше деталей

Google
Kirill
26.09.2018
14:10:22
- в оригинале было 2 эвента user/created, user/updated при популейте взяли сгруппировали оба и получили строку с createdAt, updatedAt. -Приехал еще один user/updated в источник. - В матвьюхе получился еще один элемент, но в котором не createdAt + updatedAt последнего элемента, а null вместо createdAt. Будто весь запрос сделали только над этим одним 3м эвентом

Tima
26.09.2018
14:13:04
А timestamp что содержит в строке где потеряно значение createdAt

Kirill
26.09.2018
14:13:13
<null>

т.е. как бы не противоречит п.2 твоего ответа

но что если хочется каждую новую вставку учитывать то что есть уже?

Kirill
26.09.2018
14:17:05
задача простая - есть эвент лог, делаем стриминг аналитику аггрегированную, желая последний стейт системы на момент запроса

Kirill
26.09.2018
14:18:04
вот как хранить стейты? Как нам эвент лог превратить в таблицу с стейтами?

т.е. я даже ок с тем что каждый новый стейт будет отдельной строкой

Kirill
26.09.2018
14:20:59
т.е. я даже ок с тем что каждый новый стейт будет отдельной строкой
Сделайте вьюху над таблицей с ивентами, SummingMergeTree в фоне теперь тоже может мержить состояния, так что всякие каунты можно циферкой оставить если есть необходимость

Google
Kirill
26.09.2018
14:35:23
пасиб в общем, буду пробовать aggregate

Alex
26.09.2018
14:46:20
У меня снова ворос по бэкапу. Вот я создал табличку create table testdb.test2 (id UInt64, User String) ENGINE MergeTree ORDER BY id Сделал в неё 3 инсерта. Смотрю, что у неё за партиции select partition, partition_id, name from system.parts WHERE database='testdb' AND table='test2' ┌─partition─┬─partition_id─┬─name──────┐ │ tuple() │ all │ all_1_1_0 │ │ tuple() │ all │ all_2_2_0 │ │ tuple() │ all │ all_3_3_0 │ └───────────┴──────────────┴───────────┘ Какая-то лажа. Делаю ALTER TABLE testdb.test2 FREEZE PARTITION 'all' Получаю: Wrong number of fields in the partition expression: 1, must be: 0 Что я делаю не так?

Что это за tuple() и all?

papa
26.09.2018
14:49:58
tuple() - это тупл арности 0. используется в качестве типа, имеющего одно значение. подходит для случая, когда надо не партиционировать таблицу, а значит сделать для нее одну партицию.

а вот почему id партиции не подходит в запрос - это интересно.

а freeze partition tuple() работает?

Alex
26.09.2018
14:55:57
нет, тоже не работает

о! кажется сработло!

я её как строку передавал)

спасибо!

Denis
26.09.2018
15:08:19
пасиб в общем, буду пробовать aggregate
пример https://gist.github.com/den-crane/6eff375752a236a456e1b3dc2ca7db62 пример как сделать "популейт" через null таблицу https://gist.github.com/den-crane/a72614fbe6d23eb9c2f1bce40c66893f

Dmitry
26.09.2018
16:52:36
Подскажите - не могу понять причину. Вот такой вот запрос работает: select sc_ID, sc_CAMPAIGN_ID, sc_SUBSCRIPTION_ID, su.ACCOUNT_ID su_ACCOUNT_ID, sb_VALUE2, su.ID su_ID from (SELECT sc_ID, sc_CAMPAIGN_ID, sc_SUBSCRIPTION_ID, toDecimal64(toFloat64(sb.VALUE2),3) sb_VALUE2 FROM ( select ID sc_ID, CAMPAIGN_ID sc_CAMPAIGN_ID, SUBSCRIPTION_ID sc_SUBSCRIPTION_ID from external_data.rator_subscription_campaign WHERE FROM_DATE >= toDateTime('2018-08-01 00:00:00') AND FROM_DATE < toDateTime('2018-09-01 00:00:00')) ANY INNER JOIN external_data.rator_subscription_bundle sb ON sc_SUBSCRIPTION_ID = sb.SUBSCRIPTION_ID AND sc_ID = sb.SUBSCRIPTION_CAMPAIGN_ID) ANY INNER JOIN external_data.rator_subscription su ON su.ID = sc_SUBSCRIPTION_ID

Но если его дополнительно завернуть (немного упрощенно): select sc_ID from ( select sc_ID, sc_CAMPAIGN_ID, sc_SUBSCRIPTION_ID, su.ACCOUNT_ID su_ACCOUNT_ID, sb_VALUE2, su.ID su_ID from (SELECT sc_ID, sc_CAMPAIGN_ID, sc_SUBSCRIPTION_ID, toDecimal64(toFloat64(sb.VALUE2),3) sb_VALUE2 FROM ( select ID sc_ID, CAMPAIGN_ID sc_CAMPAIGN_ID, SUBSCRIPTION_ID sc_SUBSCRIPTION_ID from external_data.rator_subscription_campaign WHERE FROM_DATE >= toDateTime('2018-08-01 00:00:00') AND FROM_DATE < toDateTime('2018-09-01 00:00:00')) ANY INNER JOIN external_data.rator_subscription_bundle sb ON sc_SUBSCRIPTION_ID = sb.SUBSCRIPTION_ID AND sc_ID = sb.SUBSCRIPTION_CAMPAIGN_ID) ANY INNER JOIN external_data.rator_subscription su ON su.ID = sc_SUBSCRIPTION_ID) то получаю ошибку: Received exception from server (version 18.12.17): Code: 179. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Different expressions with the same alias su_ACCOUNT_ID: su.ACCOUNT_ID AS su_ACCOUNT_ID and ACCOUNT_ID AS su_ACCOUNT_ID

Max
26.09.2018
17:08:28
Коллеги, всем привет. Сталкиваемся с ошибкой при установке зафиксированной версии Get:24 http://repo.yandex.ru/clickhouse/deb/stable/ main/ clickhouse-server-common 1.1.54394 [7856 B] Fetched 282 MB in 2min 2s (2310 kB/s) E: Failed to fetch http://repo.yandex.ru/clickhouse/deb/stable/main/clickhouse-server-common_1.1.54318_amd64.deb Size mismatch E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

Dmitry
26.09.2018
17:15:04
все таблицы в запросе dictionary, может в этом дело, кстати. параметр попробуем включить, спасибо

Alexey
26.09.2018
17:16:37
пасиб в общем, буду пробовать aggregate
зависит от количества стейтов на объект, у меня похожая задача, но количество апдейтов на один объект небольшое (при большом кол-ве объектов), в результате запрос по таблице с евентами работает чуть быстрее чем подобный из AggMV. Ну и еще мне надо считать количество объектов в группе в каждом стейте в случайном интервале времени (счетчик по группе). Пока не понимаю как это сделать через AggMV

Alexandr
26.09.2018
17:29:28
@milovidov_an подскажите, когда ожидается следующая stable версия, которая решает проблему memory tracking https://github.com/yandex/ClickHouse/issues/3143?

Tima
26.09.2018
17:31:29
все таблицы в запросе dictionary, может в этом дело, кстати. параметр попробуем включить, спасибо
Выключить, начиная с какой-то версии он включен по умолчанию и потому при обновлении может сломать запрос

Konstantin
26.09.2018
17:56:48
коллеги, так как лечить Block structure mismatch in UNION stream: different names of columns: ? откатывать сервер?

Google
Dmitry
26.09.2018
17:57:03
ok, понял, выключим :)

Konstantin
26.09.2018
18:09:18
Может запрос поправить?
он очень простой, select & where без каких либо вычислений

Max
26.09.2018
18:27:45
те есть версия эта

почему же http://repo.yandex.ru/clickhouse/deb/stable/main/clickhouse-server-common_1.1.54318_amd64.deb Size mismatch

Alexey
26.09.2018
18:47:12
Скажите, а можно ли при SELECT из AggregateMergeTree задавать в WHERE границы по времени, то есть, выполнить aggregate функцию только по событиям, которые попадают в диапазон? И если да, то я не понимаю, за счет чего должен получаться выигрыш по скорости по сравнению с подобной Aggregate операцией над обычным MergeTree? Если я правильно понимаю работу AggMT, то выигрыш должен получаться за счет хранения стейта и пересчете стейта при INSERT вместо SELECT. Но при выборке случайного диапазона по датам стейт не участвует (его надо считать опять, начиная с обработки первой записи в диапазоне). Помогите разобраться пожалуйста

возможно вопрос относится скорее к AggregateMV

появился новый синтаксис Engine=MergeTree partition by tuple() order by tuple() не могу найти в документации что это означает, ткните пожалуйста

Alexey
26.09.2018
18:55:07
@milovidov_an подскажите, когда ожидается следующая stable версия, которая решает проблему memory tracking https://github.com/yandex/ClickHouse/issues/3143?
Исправления MemoryTracker ещё нет. Как раз собирался либо его делать, либо выпускать ещё одну stable версию пока без исправления.

Michal
26.09.2018
18:55:11
Tuple() = пустой кортеж. Использование его в качестве ключа партиционирования = отсутствие партиционирования (одна большая партиция)

В качестве первичного ключа - данные без сортировки.

Alexey
26.09.2018
18:56:25
Также можно не указывать секцию PARTITION BY.

Michal
26.09.2018
19:00:35
В тестах КХ например тут https://github.com/yandex/ClickHouse/blob/0eed697623afd251c1908073c4a2850a9bfc9cdc/dbms/tests/queries/0_stateless/00384_column_aggregate_function_insert_from.sql

Denis
26.09.2018
19:05:49
А как с помощью AggregatedMV посчитать количество уникальных пользователей за диапазон времени, можете маленький примерчик прислать?
100500 раз уже это с вами и обсуждали, зачем вам вообще это надо? И я бы сделал по другому, просто по концу дня расчитывал конкретные цифры и складывал в отдельную табличку, по часам /дням, готовые цифры, а не стейты, потому что uniqstate это надо еще доагрегировать дофига.

Google
Michal
26.09.2018
19:09:34
Т.е. если вчера на этом телеграмм канале было 1800 пользователей , а сегодня 1810, то всего было вовсе не 3610?

UniqState (не uniqExactState) относительно компактный, доагрегация вовсе не так страшна.

UniqExact по сути хэш таблица со всеми значениями. И даже в этом случае слияние / доагрегация состояний может быть намного эффективнее чем чтение всех данных заново.

Denis
26.09.2018
19:14:59
да обсуждали все это уже все миллиард раз t.me/clickhouse_ru/61723

и в прошлый раз вышло у товарища, что по таблице считать быстрее чем по MV

Michal
26.09.2018
19:20:02
и в прошлый раз вышло у товарища, что по таблице считать быстрее чем по MV
Ну в твоём примере перевес явно на стороне MV, правда?

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

Т.е. если например в секунду приходит всего пара событий и сделать агрегацию по секундам - то использование состояний будет хуже, чем прямой подсчет.

Denis
26.09.2018
19:23:50
да, но есть у меня ощущение что последний раз закончилось это все вот так t.me/clickhouse_ru/64797

Michal
26.09.2018
19:24:23
Ага

Denis
26.09.2018
19:26:16
но может я уже запутался в обсуждениях. И в общем хотелось бы понять зачем это надо (в чем задача), а то спрашиватели делают супергранулярные MV, а потом удивляются, что медленней чем оригинальная таблица.

Michal
26.09.2018
19:26:18
Ну бывает, может быть Alexey расчитывает на Second Opinion. :)

@den_crane не расстраивайтесь так ;) кликхауса быстрый, даже если его заставить какую-то лишнюю работу делать он обычно делает это быстро :)

Denis
26.09.2018
19:33:06
ну это я тоже могу, мои пользователя жалуются, что 350 млрд. записей за целых 400 сек. обрабатываются.

Mike
26.09.2018
19:33:32
Люди гораздо более восприимчивы к лишней работе, чем кликхаус, хотя и они иногда не тормозят.

Michal
26.09.2018
19:33:38
Ну не скажите, я вчера лишней работой его на пол часа загрузил =(
Бывает :) я тут обнаружил что у нас в одном скрипте из-за переименования столбца в запросе не использовался индекс, и для какой-то ерунды раз в полчаса был фулскан :D автор скрипта думал что все нормально, т.к. перед этим то же самое работало на mysql с индексами, и при этом было медленнее чем фулскан на КХ :D

Google
Alexey
26.09.2018
19:39:52


Michal
26.09.2018
19:40:18
Я про вот эту историю
Да, я читал, и что-то там писал днём.

Неприятная штука.

Denis
26.09.2018
19:41:49
а так понял что clear column используется чтобы схлопнуть старые записи ? а чем тогда готовые движки типа графит чего-то там не подходят?

Michal
26.09.2018
19:43:44
В принципе альтер drop/detach относильно безопасны по идее можно было бы наверное не ставить локов, а просто сразу помечать партиции для удаления. Но есть риск что что-то может поломаться при этом.

Альтер ждал пока кончится селект, остальные селекты ждали когда кончится альтер.

Denis
26.09.2018
19:46:09
а ясно, меня смутил кусок в ответе task.Reports(logger), task.ClearColumns(logger), task.DropPartitions(logger),

Michal
26.09.2018
19:48:55
Не дедлок конечно, но штука неприятная. Избежать можно но скорее на уровне организацийном - типа перед запуском альтеров проверять не запустил ли кто-то одновременно длинный селект.

Alexey
26.09.2018
19:56:34
Можно убить SELECT с помощью KILL QUERY.

Michal
26.09.2018
19:58:02
Можно убить SELECT с помощью KILL QUERY.
По законам жанра окажется что это был селект шефа, и у него уже "показывало 99%" :)

порой мне кажется что для селектов когда последняя стадия выполнения по времени непонятная (типа чтения group by с диска) лучше показывать ну скажем 95% вместо 99 :)

Alexey
26.09.2018
20:04:35
Kirill
26.09.2018
20:10:42
а ReplaceMergeTree матвьюху должна триггерить обычная вьюха которая финальная, поверх aggregatedMergeTree? (у меня не триггерится)

Denis
26.09.2018
20:13:38
а ReplaceMergeTree матвьюху должна триггерить обычная вьюха которая финальная, поверх aggregatedMergeTree? (у меня не триггерится)
нет, MV на MV сделать нельзя. И смысла делать replace поверх Aggregating нет. Aggregating и так схлапывает

Kirill
26.09.2018
20:14:31
а вообще возможно произвольный инсерт триггерить на инсерт в другую табличку?

Alexandr
26.09.2018
20:14:53
Исправления MemoryTracker ещё нет. Как раз собирался либо его делать, либо выпускать ещё одну stable версию пока без исправления.
спасибо, ждем stable версию чтобы попробовать апнуть версию опять на нашем кластере.

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