
Alexey
18.08.2017
18:28:32
Да.

Vladislav
18.08.2017
18:28:35
Конечно же, при условии, что в where еще будут все колонки, которые перед isShow\isClick в ключе
Т.е. имеет смысл внести isShow в первичный ключ(у нас все сильно сложнее, чем я описал, и показы и так подзапросов вытаскиваются )?

Alexey
18.08.2017
18:31:17
Да,
"при условии, что в where еще будут все колонки, которые перед isShow\isClick в ключе"
и при условии, что эта фильтрация отфильтровывает достаточно большое количество строк.

Google

Vitaly
18.08.2017
18:31:17

Vladislav
18.08.2017
18:34:39


Александр
18.08.2017
19:05:17
Блин :) Опять с runningDifference влип )
Есть таблица, learnerId, video, action, position.
action = play - запуск видео
action = stop - остановка видео
position - место в видео (конкретная секунда)
Например данные.
SELECT *
FROM vid
┌─learnerId─┬─videoId─┬─action─┬─position─┬───────────eventTime─┬──eventDate─┐
│ 1 │ test │ play │ 0 │ 2017-01-01 00:00:00 │ 2017-01-01 │
│ 1 │ test │ stop │ 14 │ 2017-01-01 00:00:14 │ 2017-01-01 │
│ 1 │ test │ stop │ 55 │ 2017-01-01 00:01:05 │ 2017-01-01 │
│ 1 │ test │ play │ 55 │ 2017-01-01 00:01:25 │ 2017-01-01 │
│ 1 │ test │ play │ 20 │ 2017-01-01 00:00:33 │ 2017-01-01 │
│ 1 │ test │ stop │ 60 │ 2017-01-01 00:01:30 │ 2017-01-01 │
└───────────┴─────────┴────────┴──────────┴─────────────────────┴────────────┘
Тут получается, что в целом человек пропустил всего 5 секунд видео (с 15 по 20). Мне нужно в конечном счете получить кол-во уникальных человек просмотревших видео на каждой секунде...
Решил сделать так...
SELECT
uniq(learnerId),
range
FROM
(
SELECT
learnerId,
range
FROM
(
SELECT
learnerId,
action,
runningDifference(position) AS diff,
if(action = 'play', emptyArrayUInt32(), arrayFilter(x -> ((x >= (position - diff)) AND (x <= position)), range(toUInt32(position)))) AS range
FROM
(
SELECT *
FROM vid
ORDER BY eventTime ASC
LIMIT 1 BY position
)
)
ARRAY JOIN range
)
GROUP BY range
ORDER BY range ASC
Получаю что нужно...но если добавляются данные по нескольким пользователям...ну, вы сами поняли что будет :)
А вот если бы была возможность runningDifference прикончить по определенному правилу, то проблем бы не было :)
Может есть вариант создать range без runningDifference? ) Что бы работало аналогично


Igor
18.08.2017
20:42:36

Рулон
18.08.2017
21:15:38
Добрый вечер! Есть сайт на django работает с подсгресом, хочется вместо него попробовать использовать clickhouse
Может кто то решал задачу с подключением django к clickhouse?

Tima
18.08.2017
21:17:08

Рулон
18.08.2017
21:21:10
Мы протестировали кликхаус и т.к он показал классную производительность, хотели использовать в проде )

papa
18.08.2017
21:42:58
я думал у веб-фрейморков нагрузка в основном oltp

nikoinlove
18.08.2017
21:44:18
скорее его дефолтные настройки быстрее постгреса в вашем конкретном случае. попробуйте лучше mysql :)

Google

Рулон
18.08.2017
21:44:55
у нас клиенты крутят отчеты за большие промежутки времени

nikoinlove
18.08.2017
21:45:52
а у постгреса по дефолту лимит на память которую он может сожрать

Andrey
18.08.2017
21:57:08
'''Доступ к БД не связан с настройкой readonly. Невозможно дать полный доступ к одной БД и readonly к другой.'''
Из документации.
Есть ли изменения в сисетме прав доступа, или пока всё так же?

Fike
18.08.2017
22:12:23

Alexey
18.08.2017
22:34:31

Kirill
19.08.2017
09:30:37

Roman
19.08.2017
14:39:56
IP в FixedString? А почему не в uint32?

Vsevolod
19.08.2017
14:48:22
ipv6 в него не влезет, например

nikoinlove
19.08.2017
14:55:47
Так возьми тип куда влезет, а в4 конверть в в6 нотацию)

Roman
19.08.2017
15:25:19

Kirill
19.08.2017
16:39:41
IP в FixedString? А почему не в uint32?
FixedString в ClickHouse это набор байт с фиксированой длиной, очень удобно для хранения кастомных типов которых нет в КХ, но иногда нужно и "глазами" посмотреть, пока небыло встроенного типа UUID это было неочень наглядно и местами просто ломало "консольку" если кто-то его решил через клиент поле выбрать )

Igor
19.08.2017
17:59:19
Та же проблема была fixedString. Пока не было smi2 клиента приходилось очень осторожно выбирать колонки тк бинарные данные моментально ломают форматирование в консоли


hamper ?
20.08.2017
08:51:18
А вот у такой ошибки какая причина может быть?
2017.08.20 08:23:11.342928 [ 6 ] executeQuery: Poco::Exception. Code: 1000, e.code() = 0, e.displayText() = Assertion violation: !_path.empty() in file "/home/robot-metrika-test/jenkins/workspace/clickhouse-packages-build/sources/contrib/libpoco/Foundation/src/File_UNIX.cpp", line 370, e.what() = Assertion violation (from 10.*.*.*:60398) (in query: INSERT INTO table FORMAT CSV)
2017.08.20 08:23:11.369209 [ 6 ] ServerErrorHandler: Code: 99, e.displayText() = DB::Exception: Unknown packet from client, e.what() = DB::Exception, Stack trace:
0. clickhouse-server(StackTrace::StackTrace()+0x16) [0x2a890e6]
1. clickhouse-server(DB::Exception::Exception(std::__cxx11::basic_string, std::allocator > const&, int)+0x1f) [0x10dea3f]
2. clickhouse-server(DB::TCPHandler::receivePacket()+0x21f) [0x10eb2af]
3. clickhouse-server(DB::TCPHandler::runImpl()+0x55c) [0x10ec91c]
4. clickhouse-server(DB::TCPHandler::run()+0x2b) [0x10ed54b]
5. clickhouse-server(Poco::Net::TCPServerConnection::start()+0xf) [0x3416fff]
6. clickhouse-server(Poco::Net::TCPServerDispatcher::run()+0x13b) [0x341d43b]
7. clickhouse-server(Poco::PooledThread::run()+0xb7) [0x3688287]
8. clickhouse-server(Poco::ThreadImpl::runnableEntry(void*)+0xa5) [0x36542c5]
9. /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba) [0x7fadc26b76ba]
10. /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7fadc1cd83dd]
Code: 210. DB::NetException: Connection reset by peer while writing to socket (10.*.*.*:9000)


Kirill
20.08.2017
12:31:13
Всем привет. Поднял на сервере clickhouse-server в докере, порт прокинут наружу, если открыть через браузер, то отображается "Ок.", но при попытке законнектиться удаленно клиентом получаю ошибку "Code: 209. DB::NetException: Timeout exceeded while reading from socket"
При этом если прямо на сервере рядом в докере поднять клиент, то оттуда корректно получается зацепиться.
Подскажите, пожалуйста, с чем может быть связана эта ошибка? То есть он вроде цепляется к серверу, но висит долго, а потом отваливается по таймауту.
а, я понял кажется свою ошибку. я нативным клиентом пытаюсь законнектиться к порту для HTTP интерфейса

Andrey
21.08.2017
09:05:46
Пока всё так же.
А какие вы методы в Яндекс применяете для разграничения прав доступа? Аналитики у Вас не могут создать временную таблицу с аггрегатом? А если могут, то получается они могут дропнуть все данные?

Evgeny
21.08.2017
09:08:04

Google

Рулон
21.08.2017
09:42:05

Alex
21.08.2017
12:14:35

Andrey
21.08.2017
12:25:02
Я тоже сначала так подумал, но тогда если делать join, то мы будем тянуть по сети оба селекта(и левый и правый) и только потом джойнить. Больше проблем чем профита

Рулон
21.08.2017
12:46:50

Evgeny
21.08.2017
13:56:11
Clickhouse не поддерживает update. Что значит "подключить к джанге"?

Dmitrii
21.08.2017
14:04:17
подключить имеется ввиду через джанго ORM
видимо
задачка интересная, но отсутствие апдейта делает ее какой-то одноногой )

Evgeny
21.08.2017
14:22:16
Да, в этом и дело
Если хочется иметь django-подобный orm то могу посоветовать infi.clickhouse_orm опять же. Надо понимать что вы без проблем можете сделать API на джанге к данным которые хранятся в кликхаусе. Но не подключить clickhouse в качестве бэкенда для django.db.models

Evgeniy
21.08.2017
15:44:40
Привет, max_threads влияет на вставку в таблицу типа insert into ... format TSV при вставке через cat test.tsv | clickhouse-client?

Vladislav
21.08.2017
15:46:47
Всем привет.
К вопросу о ключе семлирования.
Мы хотим использовать ключем семплирования id пользователя.
ID пользователя у нас это - UUID4.
Вопрос, нужно ли этот ID оборачивать в хеш функцию по типу cityHash64? или в исходном виде пойдет? А хеш актуален только для значений которые что-то значат?

papa
21.08.2017
15:48:16
хеш актуален для значений, которые могут быть неравномерно распределены по диапазону значений своего типа, а также в случае корреляции значений с какими-то из вычисояемых статистик.

Alex
21.08.2017
15:56:19

Aleksey
21.08.2017
16:06:25
Привет. А есть ли какая-нибудь возможность заставить кх выполнять запрос, вида Select FROM Select полностью на шардах?

Alex
21.08.2017
16:13:05
Можете пример запроса привести? Distributed запрос и так выполняется по возможности на локальных машинах, но сервер-инициатор всё-таки должен принять и смержить результаты.


Aleksey
21.08.2017
16:20:10
Пример запроса:
SELECT
hash1,
hash2,
month,
p,
p - pos_diff AS prev_p,
p_diff
FROM
(
SELECT
hash1,
hash2,
month,
p,
runningDifference(hash1) AS p,
runningDifference(hash2) AS u,
runningDifference(p) AS p_diff
FROM
(
SELECT
hash1,
hash2,
month,
p
FROM distributed_table
WHERE (d = 'value') AND (month IN ('2017-05-15', '2017-06-15')) AND (hash1 = cityHash64('value2'))
ORDER BY
hash1 ASC,
hash2 ASC,
month ASC,
p ASC
LIMIT 1 BY
hash1,
hash2,
month
)
)
WHERE (p = 0) AND (u = 0)
ORDER BY p_diff DESC
LIMIT 10
Сейчас он идет в каждый шард, выполняя запрос
SELECT
hash1,
hash2,
month,
p
FROM distributed_table
WHERE (d = 'value') AND (month IN ('2017-05-15', '2017-06-15')) AND (hash1 = cityHash64('value2'))
ORDER BY
hash1 ASC,
hash2 ASC,
month ASC,
p ASC
LIMIT 1 BY
hash1,
hash2,
month
Дальше смерживает данные на сервере-инициаторе и продолжает выполнение запроса. Можно ли как-нибудь сделать так, чтобы он все выполнил на шардах, результат смержил на сервере-инициаторе, выполнил там же сортировку и limit?


Ilyas
21.08.2017
16:41:41
в конец каждого подзапроса который надо мержить локально надо добавлять "settings distributed_group_by_no_merge = 1"
если я правильно понял что нужно
но это не работало для ридонли юзеров, вроде

Google

Sergei
21.08.2017
17:10:52
Подскажите пожалуйста, есть ли способ при помощи стандартных движков решить следующию задачу:
Есть уникальный ключ (назовем его session_id)
с этим ключем могут появлять события (request_id) c определенным набором полей, но хотелось бы чтобы в итоге все поля получалсь в виде одной записи (сессия и все поля, относящиеся к этой сессии)
Можно ли, какой-то движек использовать, чтобы в рамках session_id в зависимости от request_id подставлялось нужное значение.
Можно было бы писать несколько записей , а потом GROUB BY session_id и anyIf(value1, request_id = 1), anyIf(value_2, request_id = 2)
но возможно можно как-то сократить обьем и ускорить выборки


Андрей
21.08.2017
18:10:36
Всем привет! до этого не сталкивался c clickhouse, вроде интересно в некоторых моих 'use cases'. Но мучает один вопрос. Допустим изза нештатной траблы, появится необходимость поменять какието данные за определенный период времени... с этим вообще все плохо?
а... увидел в Roadmap план "Начальная поддержка UPDATE и DELETE"

Sergei
21.08.2017
18:16:14

Андрей
21.08.2017
18:19:00
ммм, да удобно. спс, но наверно может создать лишний оверхед, если эта необходимость возникает крайне редко (вроде 2 раза за последние 1-2 года)
и еще
В приницпи сейчас у нас и так есть сервера, собирающие реалтайм стату, и раз в какойто период времени скидывающие данные в 'общую' базу (пачками)
но есть сервисы где вся стата сразу отправляется в единую базу (по мере поступления/реалтайм)
вопрос наверно так: на сколько важно даные скидывать пачками - очень важно? желательно?


Alex
21.08.2017
18:52:15
Очень важно для нормальной производительности вставок.
а... увидел в Roadmap план "Начальная поддержка UPDATE и DELETE"
Сейчас штатный способ поправить данные плохие - заменить партицию с плохими данными с помощью ALTER ... DETACH PARTITION / ATTACH PARTITION. ReplacingMergeTree для этого использовать нежелательно, т.к. действительно будет постоянный оверхед на столбец с версией, чтобы уникально идентифицировать записи, возможно придётся добавлять лишние столбцы в первичный ключ, ну и чтобы заменить данные, всё равно вручную придётся вызывать OPTIMIZE.

Алексей
21.08.2017
19:01:05

Alex
21.08.2017
19:03:16
Да, на каждую вставку происходит O(количества столбцов) disk seek-ов, а если таблица Replicated, то и где-то десяток транзакций в ZooKeeper.
Ну и константный оверхед на создание всяких временных std::string, shared_ptr и т.п., который для маленьких вставок становится заметен.

Андрей
21.08.2017
19:10:44
> с помощью ALTER ... DETACH PARTITION / ATTACH PARTITION
ну для нештатной ситуации выглядит терпимо. спс. значит жить можно :)
> ... так что критически важны.
спасибо :)

Kirill
21.08.2017
19:15:46
помогите нубу, пожалуйста. вроде простая с виду задача: сделать запрос, который на каждую дату выведет сколько всего записей было на тот день в таблице, но что-то бьюсь-бьюсь, и никак не придумаю как это сделать)

Alex
21.08.2017
19:18:47
а столбец с датой в таблице есть?

Алексей
21.08.2017
19:25:21
господа а http://repo.red-soft.biz/ фсё ?

Kirill
21.08.2017
19:25:30
упираюсь в остутствие зависимых подзапросов и то, что джойны можно делать только по равенству

Alex
21.08.2017
19:26:23
тогда SELECT date, count() from table GROUP BY date вроде бы то, что нужно

Kirill
21.08.2017
19:28:33
в том то и дело, что это выведет количество записей только по самой этой дате. а нужно вывести сколько было всего записей в таблице на тот день
ну то есть это будет постоянно растущая кривая

Google

Alex
21.08.2017
19:29:41

Алексей
21.08.2017
19:30:39
хм. другие репы я слышал имеются да. но ту можно убирать из плейбука ?

Kirill
21.08.2017
19:31:04

Алексей
21.08.2017
19:32:54
@ztlpn судя по сайту altinity это вы, да ?

Alex
21.08.2017
19:34:58
Нет, не мы (Яндекс) ? От altinity в чате есть @alexanderzaitsev

Алексей
21.08.2017
19:36:13
ой. я при быстром прочтении ника вас с ним спутал :)
извните :)

Alex
21.08.2017
19:37:21
ничего страшного ?
да
Есть способ с помощью недокументированной функции runningAccumulate(). Сейчас постараюсь изобразить...

Roman
21.08.2017
19:47:19
SELECT date, runningAccumulate(countState()) FROM (SELECT date FROM Table WHERE date > '2017-08-10' ORDER BY date) GROUP BY date
как-то так?)
по идее даже подзапрос и ORDER не нужен. Не знаю, бывают ли ситуации, когда данные не отсортированы по date?

Alex
21.08.2017
19:57:00
Почти верно. Единственное, для производительности лучше сначала GROUP BY, а потом ORDER BY, а у вас наоборот. ORDER BY всё-таки нужен, иначе блоки данных могут придти в произвольном порядке, и запрос отработает, но выдаст не совсем то, что нужно.

Roman
21.08.2017
19:58:01
а, ну логично, конечно )