
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
Всем привет, а есть в КХ функция, которые объединяет два массива в один?
что-то типо union, например для
SELECT arrayUnion([1, 2, 3], [4, 5, 6]) AS res
вернула бы [1, 2, 3, 4, 5, 6]
В ближайшем релизе появится нормальная операция конкатенации массивов и не только.

Tima
11.09.2017
06:37:04

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

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

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

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
Мне нужно собрать общую продолжительность эвентов с группировкой по дням. Есть дата начала эвента и дата завершения эвента. Если эвент растянулся на пару дней, то нужно за эти несколько дней на каждый день посчитать продолжительность.

Александр
11.09.2017
14:03:02
Можно проецировать на визиты. Есть время визита, например визит длился 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
Да

Admin
ERROR: S client not available

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

papa
11.09.2017
14:05:20
toStartOfDay()

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

Google

Александр
11.09.2017
14:05:42
Блин, точно....забыл про них совсем! Сори, что дернул глупым вопросом!

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, как бы два столбца пустые

Tima
11.09.2017
18:28:21

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.)
Что может быть?

Felixoid
11.09.2017
19:30:42

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 сервера, а забираем с одного )

Google

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

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 - уровень куска - глубина дерева слияний, которыми он образован
(из доки)