@clickhouse_ru

Страница 257 из 723
papa
10.09.2017
17:22:33
Как заклинание прозвучало :)
пока что так и есть, скоро будет менее хакерская функция.

Kirill
10.09.2017
17:39:07
А есть ли способ сгруппировать не только одинаковые массивы, но группировать массив и с теми что полностью в него входят, например: action | categories 1 | [1,2,3,4,5] 1 | [2,3] 2 | [1,2] 2 | [2,3] сгруппировать SELECT action, fn(categories) AS cat, COUNT() AS cnt FROM t GROUP BY action, cat и получить 1, [1,2,3,4,5], 2 2, [1,2], 1 2, [2,3], 1 ?

papa
10.09.2017
17:42:02
а вы это хотя бы на каком-то языке программирования можете написать?

например если у вас есть A, B, A and B, куда должна попасть третья строка, в первую группу или во вторую?

Google
Kirill
10.09.2017
17:50:16
да, могу, 3-й никуда не должен попасть, вобщем если по проще то, для группировки нужно чтоб дольшие массивы включали в себя меньшие, т.е. если есть [A],[B] и [A,B] то останется [A,B]

papa
10.09.2017
17:52:08
если я правильно вас понял, то вы хотите примерно вот что. у вас есть некоторое подмножество X какого-то powerset P, и вы хотите найти в нем Xmax = {x \in X| !\E a: x \subset a }, т.е. множество "максимальных" элементов X, и потом каждый элемент округлять до максимального. во-первых у вас проблема с неоднозначностью, а во-вторых, на уровне исполнения запроса это преобразование не функция отдельной строки.

Kirill
10.09.2017
17:53:27
ok, пустые не группируем

papa
10.09.2017
17:54:13
я могу непустой пример придумать.

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

Денис
10.09.2017
22:40:32
Про проблемы с негативными енумами - пардон, ложная тревога, ошибка в коде создания таблицы (в значения енума при сериализации попадал какой-то непечатный символ, который не было видно describe/show create).
Здравствуйте ,как победили баг? у меня абсолютно аналогичная ситуация, понять не могу откуда ноги растут Code: 49, e.displayText() = DB::Exception: Unknown element 'umts' for type Enum8('noservice' = 1, 'gsm' = 2, 'umts' = 3, 'lte_fdd' = 4, 'lte_tdd' = 5), e.what() = DB::Exception

Alexey
10.09.2017
23:53:06
Tima
11.09.2017
06:37:04
В ближайшем релизе появится нормальная операция конкатенации массивов и не только.
Можете уточнить, когда ожидается и в какой мере более полная поддержка JOIN? Тут https://clickhouse.yandex/docs/en/roadmap.html достаточно размыто написано

Igor
11.09.2017
07:11:04
@ckcnik У меня в коде, который создавал таблицы, затесался какой-то непечатный символ, пробел нулевой ширины или что то вроде. Он все и портил.

Tima
11.09.2017
08:39:57
Вот запрос из доки http://joxi.ru/RmzNOePtWOkvPm (примерно тут https://clickhouse.yandex/docs/ru/query_language/queries.html#id9) Что он делает, прям по UserId агрегирует что ли?

Александр
11.09.2017
08:55:18
Я так полагаю, что это было бы аналогично, если было бы написано avgIf или where userId IN

Tima
11.09.2017
09:04:09
Я так полагаю, что это было бы аналогично, если было бы написано avgIf или where userId IN
Похоже, но вопрос в том, а по какому полю считается avg?

Google
Александр
11.09.2017
09:10:18
А, видимо считается доля строк по каждому userId, хотя могу ошибаться

Хотя avg все таки считает среднее

Ну да ) Там написано "за каждый день после 17 марта считаем долю хитов, сделанных посетителями, которые заходили на сайт 17 марта"

Alexey
11.09.2017
10:52:26
Добрый день. Помогите советом. Есть задача "обновлять" имеющиеся записи в КХ (да, знаю, что апдейтов нет) Есть таблица пользователей. У каждого есть уникальный айди и много атрибутов В момент добавления записи не все атрибуты могут быть известны. По мере поступления новых данных атрибуты надо обновлять Есть работающее решение - просто инсертить новые записи, а каждый атрибут вычислять через argMax (у каждой записи есть таймстемп) группируя по user_id. Оно работает, но не очень быстро. Пользователей не очень много (сейчас около 3 миллионов, но число будет расти). Нужны они в КХ т.к. хотим по атрибутом пользователя фильтровать события (джоинить таблицы юзером в ивентов). Есть ли варианты лучше? Еще были мысли сделать "юзеров" сделать через словарь (в mysql например) не будет ли их количество проблемой?

Vsevolod
11.09.2017
11:03:53
Попробуйте вынести агрегацию в материализированное представление и оттуда с доагрегирующим запросом вытаскивать

Данное решение сократит количество строк, так как КХ потихоньку будет их схлопывать

Mariya
11.09.2017
11:11:41
Можно попробовать инкрементальный лог и CollapsingMergeTree - https://clickhouse.yandex/docs/en/table_engines/collapsingmergetree.html

Александр
11.09.2017
11:14:25
Добрый день. Помогите советом. Есть задача "обновлять" имеющиеся записи в КХ (да, знаю, что апдейтов нет) Есть таблица пользователей. У каждого есть уникальный айди и много атрибутов В момент добавления записи не все атрибуты могут быть известны. По мере поступления новых данных атрибуты надо обновлять Есть работающее решение - просто инсертить новые записи, а каждый атрибут вычислять через argMax (у каждой записи есть таймстемп) группируя по user_id. Оно работает, но не очень быстро. Пользователей не очень много (сейчас около 3 миллионов, но число будет расти). Нужны они в КХ т.к. хотим по атрибутом пользователя фильтровать события (джоинить таблицы юзером в ивентов). Есть ли варианты лучше? Еще были мысли сделать "юзеров" сделать через словарь (в mysql например) не будет ли их количество проблемой?
У нас похожая схема используется. Только мы используем ReplacingMergeTree и пишем данные сразу по всем колонкам. Они пересчитываются после получения новых эвентов о пользователе (посчитать, сагрегировать и пр. в КХ невозможно из-за особенностей бизнес-логики). Через словарь в КХ пробовал, но проблема словаря в том, что например на 250к строк есть определенный лаг, т.к. КХ почему то на каждый запрос лезет в MySQL и проверяет актуальность ключей (возможно я ошибаюсь и он берет из кеша, но все равно как то долго), поэтому вариант с MySQL у нас отвалился.

Лучше хранить где то старое состояние, например в redis, после вычисления новых данные, брать старое состояние, обновлять его и писать в КХ

Это будет куда быстрее, чем считать argMax

Firej
11.09.2017
11:30:59
Привет! скажите всетаки, как победить такую ошибку - DDLWorker: Will not execute task query-0000000066 : There is no a local address in host list

я так понимаю от зукипера приходит задание с неправильным хостом и CH-сервер не находит себя в списке хостов. А где посмотреть эти задания сами. в консоли зукипера все как будто нормально отображается

Bob
11.09.2017
12:35:25
У вас на всех узлах кластера настроен кластер?

Firej
11.09.2017
12:50:22
ну да

<remote_servers> <replicator> <shard> ...

Ilya
11.09.2017
13:00:38
Добрый день! Я ведь правильно понимаю, что при выполнении запроса: SELECT a, any(b), any(c) FROM table GROUP BY a нет гарантии что b и c будут из одной записи?

Александр
11.09.2017
13:00:54
все верно

papa
11.09.2017
13:01:28
насколько я помню, any((b,c)) = (any(b),any(c))

так что второй вариант можно использовать.

Ilya
11.09.2017
13:03:45
Спасибо

Google
Andrey
11.09.2017
13:05:47
Добрый день. Настраиваю работу 2 шардов по 2 реплики. Странное поведение: делаю вставки в distributed таблицу на 1-ом сервере, часть данных уходит на 4-ый (шардирование работает нормально), но не все данные попдают на сервер 3 с 4-го (реплики) и ничего не пишется на 2-ой (реплика первого)

в логах ReshardingWorker: no node, path: /clickhouse/task_queue/resharding/clickhouse1

CREATE TABLE video ( ... ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/video', '{replica}', EventDate, cityHash64(URL), 8192); CREATE TABLE video_distributed AS video ENGINE = Distributed(statistics, default, video, cityHash64(domainWithoutWWW(URL)));

в конфигах <macros incl="macros"> <shard>1</shard> <replica>clickhouse1-1</replica> </macros> <macros incl="macros"> <shard>1</shard> <replica>clickhouse1-2</replica> </macros> <macros incl="macros"> <shard>2</shard> <replica>clickhouse2-1</replica> </macros> <macros incl="macros"> <shard>2</shard> <replica>clickhouse2-2</replica> </macros>

Alexey
11.09.2017
13:16:33
Можете уточнить, когда ожидается и в какой мере более полная поддержка JOIN? Тут https://clickhouse.yandex/docs/en/roadmap.html достаточно размыто написано
В Q4. Можно будет делать JOIN-ы без необходимости оборачивания всего в подзапросы и с обычным синтаксисом.

Kirill
11.09.2017
13:17:39
Минимальной датой в DateTime тоже является 1970-01-01 как в Date ?

hulponot
11.09.2017
13:23:50
Добрый день, подскажите пожалуйста по внешнему словарю. complex_key_cache смотрит в постгрес. Когда не находит записи по ключу, то кидает "RecordSet contains 0 columns while 5 expected", а в постгресе вижу висит запрост PREPARE ... с этим ключем. Вопрос примерно: почему иногда он умеет доставать несуществующую запись и заполнять дефолтными значениями, а иногда отваливается?

Tima
11.09.2017
13:27:29
В Q4. Можно будет делать JOIN-ы без необходимости оборачивания всего в подзапросы и с обычным синтаксисом.
Спасибо за ответ. А стоит ожидать появление этого функционала до конца года? Или Q4 - дата начала разработки?

hulponot
11.09.2017
13:39:40
>Результат у этого запроса непустой? Если с постгреса приходит пустой ответ (0 rows) на простой dictGetString('xxx', 'attr', tuple(guid,id)), так будет работать?

Александр
11.09.2017
13:58:53
Есть дата и время, например 2017-09-11 14:44:01, ее как то функциями для работы с датами можно преобразовать в 2017-09-11 23:59:59? )

Tima
11.09.2017
14:00:09
Александр
11.09.2017
14:01:06
Мне нужно собрать общую продолжительность эвентов с группировкой по дням. Есть дата начала эвента и дата завершения эвента. Если эвент растянулся на пару дней, то нужно за эти несколько дней на каждый день посчитать продолжительность.

Можно проецировать на визиты. Есть время визита, например визит длился 15 минут. Начался визит 2017-09-10 23:55:00 а кончился 2017-09-11 00:10:00. И вот результат запроса должен быть типа 2017-09-10 - 300 2017-09-11 - 600

Хм, хотя я могу использовать timeSlots

Tima
11.09.2017
14:04:13
Округлить до даты можно так: 1. toDate(date) 2. substring(date, 1, 10) А что такое 300 и 600 в примере? Продолжительнось в секундах?

Александр
11.09.2017
14:04:49
Да

Мне не округлить до даты нужно ) Мне нужно зная дату поставить ей время в 23.59.59 )

papa
11.09.2017
14:05:20
toStartOfDay()

Александр
11.09.2017
14:05:21
Хотя это костыль. Сейчас попробую через timeSolts попробовать

Блин, точно....забыл про них совсем! Сори, что дернул глупым вопросом!

Google
Vladislav
11.09.2017
14:27:55
А нормально делать представление у реплицируемой таблицы тоже реплицированным? Синхронизация от этого не поломается?

Kirill
11.09.2017
14:42:08
Нет, не поломается

Александр
11.09.2017
14:43:38
Вобщем разобрался ) Если кому будет интересно как например растянуть эвент и посчитать время эвента по дням, учитывая время начала и время окончания эвента, то можно вот так) SELECT toDate(started) + days as date, if (started > toStartOfDay(toDateTime(date)), started, toStartOfDay(toDateTime(date))) as dateStarted, if (toStartOfDay(toDateTime(date)) + 86399 > ended, ended, toStartOfDay(toDateTime(date)) + 86399) as dateEnded, started as oStarted, ended as oEnded, if (toDate(oStarted) != toDate(dateEnded), dateEnded - dateStarted + 1, dateEnded - dateStarted) as dateDuration FROM ( SELECT toDateTime('2017-09-09 23:55:00') AS started, toDateTime('2017-09-12 14:00:00') AS ended, range(toUInt8(if(toDate(started) != toDate(ended), (toDate(ended) - toDate(started)) + 1, 1))) AS days, 223500 as duration ) ARRAY JOIN days

В финале должно получиться что-то вроде https://img.facedsid.ru/f2brp.jpg

Firej
11.09.2017
15:58:22
разобрались - в конфиге реплик был не правильный порт указан. Нужен 9000, а я обычный http порт прописал

prll
11.09.2017
15:58:41
Petr
11.09.2017
18:24:15
Привет всем, как импортитровать пустую строку из csv? Там в таком виде data,,,data, как бы два столбца пустые

Petr
11.09.2017
18:31:07
cat file.csv | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV";

Tima
11.09.2017
18:41:41
И что пишет, когда выполняете эту команду?

Petr
11.09.2017
18:56:31
И что пишет, когда выполняете эту команду?
Все нормально, со структроро не совпадало, спасибо

Lexa
11.09.2017
19:08:28
Добрый вечер. Наткнулся на непонятное поведение Enum. :) select * from Order where Rebill='yes'; SELECT * FROM Order WHERE Rebill = 'yes' Received exception from server: Code: 49. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Unknown element 'yes' for type Enum8('no' = 0, 'yes' = 1). 0 rows in set. Elapsed: 0.068 sec. :) select Rebill,Count(*) from Order group by Rebill; SELECT Rebill, Count(*) FROM Order GROUP BY Rebill ┌─Rebill─┬─Count()─┐ │ no │ 390136 │ │ yes │ 302973 │ └────────┴─────────┘ 2 rows in set. Elapsed: 0.011 sec. Processed 693.11 thousand rows, 693.11 KB (61.00 million rows/s., 61.00 MB/s.) Что может быть?

Lexa
11.09.2017
19:32:23
при описании таблицы задаются значения enum. они при группировке присутсвуют. но при выборке вылетает эта ошибка. поменял поле в таблице на строку и запрос работает.

Felixoid
11.09.2017
20:04:06
ну, таки интересно https://pastebin.com/TEu0pu42 @milovidov_an эмм, там прямо хеши разные

Денис
11.09.2017
20:04:17
у меня подобная проблема и она не решилась, у меня эта бага вылетает во время инсерта через infi.clickhouse_orm, причем баг мигающий какой-то

silencer
12.09.2017
04:15:39
@miptgirl @milovidov_an @the_real_jkee clean time

Konstantin
12.09.2017
07:08:39
Всем привет! Если есть народ использующий в работе Microsoft PowerBI - создал голосвание на добавление коннектора к КХ: https://ideas.powerbi.com/forums/265200-power-bi-ideas/suggestions/31355041-add-connector-to-clickhouse p.s. если сами не используете, но знаете аналитиков которые используют - тоже киньте им ссылочку на голосование =)

Yurij
12.09.2017
08:56:43
Интересует по опыту, допустим, нет агрегаций в запросах и не планируется. Имеет ли смысл для репликации во избежание проблем со статическим dns использовать кафку а у подписчика будет простой инстанс КХ уже без репликаций. ( если рассмотреть для начала схему совсем утрированно, то льем данные на 2 сервера, а забираем с одного )

Kotbegemot
12.09.2017
09:51:40
@milovidov_an спасибо за odbc драйвер

Google
N
12.09.2017
10:00:59
Доброго дня! Подскажите, пожалуйста, "testdb.test1 20170701_20170731_698330_700900_322" - первое и второе число понятно что, а остальные?

hulponot
12.09.2017
10:03:40
Рассмотрим по порядку имя первого куска: 20140317_20140323_2_2_0. 20140317 - минимальная дата данных куска 20140323 - максимальная дата данных куска 2 - минимальный номер блока данных 2 - максимальный номер блока данных 0 - уровень куска - глубина дерева слияний, которыми он образован (из доки)

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