
Kirill
08.09.2017
09:38:12
Аналитиков много ?

Igor
08.09.2017
09:38:26
да

Александр
08.09.2017
09:38:41
Тут несколько вариантов )
1. Уменьшить количество запросов на один сервер КХ;
2. Сделать кеширующую прослойку;
3. Сделать несколько реплик и балансировать запросы на реплики.
Я бы выбрал третий вариант в любом случае и размазывал запрос по репликам. Только нужно учитывать replication lag.

Google

Kirill
08.09.2017
09:40:05
да
зачем все делают одно и тоже ?

Александр
08.09.2017
09:40:07
Т.е. может получиться так, что два одновременных запроса на две разные реплики вернут разный результат, а спустя секунду одинаковый - это нормально. Но если это критично, то делать не асинхронную, а синхронную репликацию.

Maksim
08.09.2017
09:40:27
Есть еще мысль что лучше сгруппировать похожие запросы и сделать один
Потому что много делается фулскана

Igor
08.09.2017
09:41:19

Александр
08.09.2017
09:41:41

Igor
08.09.2017
09:42:00

Александр
08.09.2017
09:42:33
пока начали 1 и 2 пути
Если у вас один шард, то поднимите несколько реплик и можно обычным round robin'om зарулить запросы
Я не уверен, но мне кажется, что у нас слишком жирные сервера в кластере, а данных на них не много, поэтому ничего не ложится...пока что :)

Maksim
08.09.2017
09:56:09
Вместо where accountId= сделать accountId in () и group by accountId

Александр
08.09.2017
09:57:25
У меня запросы отрабатывают вот как то так. https://img.facedsid.ru/bbv7f.jpg

Google

Igor
08.09.2017
10:20:02
Круто, спасибо, попробуем что то такое применить!)

Vladislav
08.09.2017
10:20:41
кто-нибудь гугловый DataStudio использует? они открыли доступ к написанию любых коннекторов. я бы мог написать для КХ, но нам DataStudio не нужен.

Александр
08.09.2017
10:24:26
Круто, спасибо, попробуем что то такое применить!)
Только у меня судя по запросу не передаются конкретные айдишки, конкретные айдишки кладудтся во временную таблицу и к ним джойнятся данные, этотна случай если по какому то идентификатору вообще нет данных в кх и строка не вылетала из выдачи

Stepan
08.09.2017
10:44:09
Всем привет!
Есть n хостов с реплицируемыми табликами, на одной из реплик данных нет и в логах ошибка:
<Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Poco::Exception. Code: 1000, e.code() = 104, e.displayText() = Connection reset by peer, e.what() = Connection reset by peer
и все, что это может быть? Не подскажите?
Проблема очень рандомная, на тесте ошибка есть, на проде нет. Конфиги одинаковые

Pavel
08.09.2017
10:46:02
Привет! Подскажите, пожалуйста, как из пандаса получить csv с null значениями, пригодными для clickhouse.
df.fillna('\N', inplace=True)
df.to_csv()
выдает мне \\N, что не парсится ch =(

Kirill
08.09.2017
11:38:46

Мария
08.09.2017
11:44:05
Добрый день!
Подскажите, почему не срабатывает функция arrayJoin?
Выполняю такой запрос:
select a.*, arrayJoin(splitByString(',',moid)) as mas_moid from table1 a
Ошибка:
ARRAY JOIN requires array argument
Приводила явно к типу Array - та же ошибка.
К конкретному элементу массива могу обратиться, а применить любую функцию, которая обрабатыет массив - нет.

Александр
08.09.2017
11:47:32
Возможно нужно завернуть в подзапрос

Tima
08.09.2017
11:47:41

Мария
08.09.2017
11:48:52
Пробовала посчитать количество элементов - подсчитывает правильно

Александр
08.09.2017
11:48:55
Мало ли оптимизатор глючит или еще чего )

Мария
08.09.2017
11:49:25
В подзапрос тоже пробовала ввернуть, аналогичная ошибка

Tima
08.09.2017
11:57:43
Я бы посоветовал убрать лишние колонки, алисы для таблиц и оставить только arrayJoin(splitByString(',',moid))

papa
08.09.2017
11:59:20
а что выдает вот такая штука
SELECT
moid,
toTypeName(splitByString(',', moid)) AS tn
FROM ...
WHERE tn != 'Array(String)'
limit 1

Мария
08.09.2017
12:00:50
в столбце tn такое значение: Nullable(Array(String))

papa
08.09.2017
12:01:25
ага. а может у вас и moid бывает null?

Мария
08.09.2017
12:02:19
moid Nullable(String)

Александр
08.09.2017
12:03:03

papa
08.09.2017
12:04:02
splitByString(_, null) = null, и этот null не массив, поэтому array join-у плохеет.

Google

Мария
08.09.2017
12:04:22
нет, у меня сейчас нет таких строк. все moid не пустые

papa
08.09.2017
12:07:14
а каая у вас версия сервера, у меня другая ошибка отдается
SELECT splitByString(',', moid)
FROM
( SELECT CAST('a' AS Nullable(String)) AS moid)
Received exception from server:
Code: 43. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Nested type Array(String) cannot be inside Nullable type.
впрочем, в обоих случаях это выглядит как баг.

Мария
08.09.2017
12:12:01
может, у кого-нибудь есть идеи, как выкрутиться? пробовала привести к массиву с помощью CAST (может, конечно, сути это не меняет), ошибка та же

Stas
08.09.2017
12:12:07
А через sql из tabix мы не можем посмотреть версию sql? (Всегда интересовало)

Александр
08.09.2017
12:12:39

Stas
08.09.2017
12:12:40

papa
08.09.2017
12:12:48
select version() ?

Мария
08.09.2017
12:14:15

Stas
08.09.2017
12:14:17
Логично...

papa
08.09.2017
12:14:53

Igor
08.09.2017
12:16:41

Мария
08.09.2017
12:16:54

papa
08.09.2017
12:17:41
что у нас там еще есть, assumeNotNull(moid) ?

Мария
08.09.2017
12:19:20
с assumeNotNull заработало
спасибо!

papa
08.09.2017
12:22:25
но надо понимать что с таким же успехом вы могли проальтерить колонку в не-Nullable тип, это даже в каком-то смысле безопаснее, т.к. сейчас ваш запрос будет работать до тех пор пока вы внезапно не вставите в moid null.

Мария
08.09.2017
12:26:32
а что будет, если в moid попадется Null? assumeNotNull вернут ошибку и все отвалится или он просто пропустит эту строку?

papa
08.09.2017
12:28:03
кажется, вот такой вариант должен подойти
SELECT
moid,
if(isNull(moid), emptyArrayString(), splitByString(',', assumeNotNull(moid))) AS x
FROM
(
SELECT CAST('' AS Nullable(String)) AS moid
UNION ALL
SELECT CAST(NULL AS Nullable(String))
)
┌─moid─┬─x────┐
│ │ [''] │
└──────┴──────┘
┌─moid─┬─x──┐
│ \N │ [] │
└──────┴────┘

Мария
08.09.2017
12:30:18
спасибо!

Google

Firej
08.09.2017
13:00:49
Почему при попытке создания таблички на второй реплике получаю такое сообщение - Will not execute task query-0000000068 : There is no a local address in host list.
на первой машинке создается все нормально, на второй нет и получаю отлуп - is executing too long (121 sec.)....
я так понимаю кривой конфиг, но где я не прав не пойму

Александр
08.09.2017
13:53:42
А в limit by нельзя больше одной колонки передать?
Разобрался ) Можно )

Ilya
08.09.2017
14:49:55
@milovidov_an ?☝️

Kirill
08.09.2017
15:01:29
? Что это было ?

Александр
08.09.2017
15:46:13
А как можно выкинуть из результата строки у которых идет несколько одинаковых значений подряд?
Например. Есть таблица с эвентами и идентификаторами сущности и пользователя.
userId entityId action
1 1 enter
1 1 success
1 1 exit
1 1 success
1 1 success
1 1 success
1 2 enter
1 2 exit
1 2 exit
1 2 exit
2 1 enter
2 1 success
2 1 exit
Что бы в результате осталось
1 1 enter
1 1 success
1 1 exit
1 2 enter
1 2 exit
2 1 enter
2 1 success
2 1 exit
sequenceMatch не подходит т.к. нужно выбирать колонку с временем, а по ней group by естественно не сделаешь

papa
08.09.2017
15:47:03
distinct ?

Александр
08.09.2017
15:47:35
Задача немного сложнее :) Есть перед userId колонка с eventTime типа DateTime
Да и distinct оставит только один эвент, у меня например у пользователя 1 может быть несколько последовательностей типа enter, success, exit на одну сущность
Я так понял, что никак :)

Vsevolod
08.09.2017
15:49:18
group by user_id, entity_id, action? :)

Александр
08.09.2017
15:49:50
Не получится, есть колонка с временем по которой group by не сделаешь

Vsevolod
08.09.2017
15:49:56
any(time)

Александр
08.09.2017
15:50:01
результат получиться идентичен результату без group by

Vsevolod
08.09.2017
15:50:04
или max или min

Александр
08.09.2017
15:50:26
any(time) тоже не подойдет, т.е. будет случайное число, а мне нужно точное время

Vsevolod
08.09.2017
15:50:34
avg?

Александр
08.09.2017
15:50:46
Просто есть последовательность событий и из них нужно строить например сессии

Google

Александр
08.09.2017
15:51:06
И логика такая, что сессия - это наличие enter + (success || exit)
И так, то бы между ними не было дырки больше чем 30 минут
И исключать например 30 подряд идущих enter событий
Помимо времени выбирается еще несколько колонок )

Vsevolod
08.09.2017
15:52:06
join с самой собой, фильтрация по разнице не более 30 минут + группировка

Александр
08.09.2017
15:52:07
Вобщем то я понял, что лучше на клиенте это дело обработать и выкинуть лишние данные
Тут вопрос именно в том, что бы выкидывать битые последовательности. Например часть данных не поступила и у пользователя идет 100 enter в сущность подряд. Такие вещи нужно выкидывать. Сессия считается полной только в случае наличия двух событий из возможных трех событий.
Тут получается окно, а с окнами в CH пока никак

Vsevolod
08.09.2017
15:54:58
Окна решаются с помощью джоина таблицы с самой собой)

Александр
08.09.2017
15:55:15
Блин ) Таблица так то 850кк )

Vsevolod
08.09.2017
15:55:30
У меня только что была такая задача как вычисление среднего значения между событиями с интервалом не более определенного времени
Я с 5 млн работаю и все ок

Александр
08.09.2017
15:56:11
Ладно, попробую сейчас джоин, предварительно фильтруя по какому либо признаку )

Vsevolod
08.09.2017
15:56:11
Делайте максимальную фильтрацию перед джоинами таблицы
Думаю все получится)

papa
08.09.2017
15:57:25

Mariya
08.09.2017
15:59:23
Я такое считала, выглядит примерно так:
SELECT
groupArray(EventName) as events,
groupArray(Time) as times,
arrayEnumerate(events) as events_index,
arrayFilter(name, index -> (index = 1) OR (events[index] != events[index - 1]), events, events_index) as events_filt,
arrayFilter(time, index -> (index = 1) OR (events[index] != events[index - 1]), times, events_index) as times_filt
FROM (
SELECT * FROM mytable ORDER BY time
)