
Yu
13.01.2017
15:51:07
Привет. Есть проблема.
Есть кластер из трёх серверов clickhouse.
На первой машине созданы distributed таблицы, ссылающиеся на таблицы на всех трёх машинах.
Clickhouse запущен в докере.
После останова и запуска первого сервера с distributed таблицами, на любой запрос в эти таблицы выдает ошибку
Code: 170, e.displayText() = DB::Exception: Requested cluster '(ch - cluster) - 1' not found, e.what() = DB::Exception
При пересоздании distributed таблиц запросы отрабатывают нормально.
ClickHouse server version 1.1.54030

Roman
13.01.2017
15:53:09
адрес у него остается прежним?

Yu
13.01.2017
15:53:20

Vladimir
13.01.2017
16:05:09
Ребята, привет всем! Вопрос по плагину для графаны. Подскажите как ее инсталить.

Google

Roman
13.01.2017
16:12:14
скопировать директорию clickhouse из репы clickhouse-grafana в директорию /var/lib/grafana/plugins/, перезапустить графану

Vladimir
13.01.2017
16:13:10
ок. Спасибо. А планируется ли добавить датасорс в grafana.net?

Roman
13.01.2017
16:14:46
Там нет поддержки некоторых функций графаны, а также остутствуют тесты. Возможно, в будущем, когда это будет реализовано мы опубликуем и там

Vladimir
13.01.2017
16:15:59
Большое спасибо. Сейчас будем смотреть что и как. Очень здорово что можно сделать рисовку не по времени. Подобный вопрос я открыл неделю назад у них - пока без особого шевеления)))

Mike
13.01.2017
17:26:03
Всем привет, а подскажите плиз, никто Pentaho BI не подружил до конца с кликхаусом? jdbc драйвер собрал и объяснил его пентахе, она подружилась с ним, но идут ошибки по sql запросам, может быть есть какие-то методы их подружить полностью?

Alexey
13.01.2017
17:35:44


Andrey
13.01.2017
17:45:36
Всем привет. Подключил внешние словари в формате CSVWithNames (может есть вариант использования бинарного файла?) от сервиса ip2location. НО, я хочу, чтобы у меня ключ был двухзначный код страны, чтобы по нему выбирать имя страны потом. Словарь подключился, но при попытке запроса "select dictGetString('country', 'COUNTRY_NAME', 'RU')" получаю ошибку, что id должен быть UInt64. id всегда должен быть только UInt64?
При создании словаря ошибки не получил
layout -> hashed


Igor
13.01.2017
17:47:40
Можно использовать complex_key-словари. Они поддерживают произвольные типы ключей.
Словари по составному ключу:
Конфиг словаря с составным ключом отличается двумя вещами:
В качестве layout указывается complex_key_hashed или complex_key_cache.
Указывается несколько атрибутов в structure/key.
Пример:
<layout>
<complex_key_hashed />
</layout>
<structure>
<key>
<attribute>
<name>uid</name>
<type>UInt64</type>
</attribute>
<attribute>
<name>order_id</name>
<type>UInt32</type>
</attribute>
</key>
<attribute>
<name>has_access</name>
<type>UInt8</type>
<null_value>0</null_value>
</attribute>
</structure>
Для использования словаря с составным ключём, в функции для работы со словарями, в качестве аргумента-ключа передаётся кортеж.
Пример: dictGetString('dict', 'attr', (k1, k2)).
В качестве элементов ключа, поддерживаются произвольные типы данных (в том числе, строки).
Не смотря на название, complex_key_-словарь может иметь и один компонент в качестве ключа. То есть, не составной ключ.
При этом, в отличие от обычных словарей, этот ключ может иметь любой тип.
В этом случае, в функции для работы со словарями, нужно передавать кортеж из одного элемента.
Пример: dictGetString('dict', 'attr', tuple(k)).
- как видно, для описания кортежа из одного элемента, используется функция tuple.
Для типов UInt32 и подобных, я не рекомендую использовать complex_-словари, так как это будет менее эффективно, чем обычные.
А вот для типа String или составного - вполне.


Andrey
13.01.2017
17:48:37
Спасибо за быстрый ответ! :)
Еще один вопрос. Ключ в словаре всегда должен быть первым? Формат CSV, первым идет полное имя страны, а только потом поле с 2-х значным кодом страны. Я хочу в качетсве ключа использовать второе поле. Так можно? Словарь подключился, но не ищет. Есть подозрение, что он в качестве ключа использует превый столбец :)
да, сейчас проверил. Ключ должен быть первым полем

Google

Andrey
13.01.2017
18:23:47
Возможно кому-то пригодится решение :)
csvtool col 2,1,3,4 IP2LOCATION-COUNTRY.CSV > IP2LOCATION-COUNTRY-new.CSV

f1yegor
13.01.2017
19:31:30

Slach
14.01.2017
07:06:37
А нет ли како-го то более простого способа вставки для полей Nested структуры в INSERT кроме как через массивы одинаковой длинны?

Alexey
14.01.2017
07:07:09
Нет.

Slach
14.01.2017
07:13:31
у меня просто блин на вход получается разряженные данные, в двумя разными индексами, и непонятно как привести их к некоей матрице максимального размера
=)
я просто пишу загрузку google measurement protocol в clickhouse
и там есть часть которая называется Enhancement eCommerce
и в ней поля типа
il1pr10size=10
pr1nm=Title
хочется запихнуть их в
в
eCommerce Nested (
listIndex UInt16,
productIndex Uint16,
size String,
title String
)
получается что надо как то преобразовать в
INSERT INTO table (eCommerce.listIndex, eCommerce.productIndex, eCommerce.title, eCommerce.size)
VALUES([1,0],[10,1],["","Title"],["","size"])
кто нибудь тут такое уже сделал?

Виктор
14.01.2017
08:04:51
Мы в Метрике делали, хех
Так и преобразуем примерно
Только загрузка не через values но это не очень важно

Slach
14.01.2017
08:06:43
ну я тоже TSV хочу
а на чем вы делали???
блин =(( я тупой какой то... у меня не получается

Виктор
14.01.2017
08:07:52
Я не очень понимаю сложность честно говоря
Кодом делали :) на каком-то языке программирования

?Zloool?
14.01.2017
11:24:16
Подскажите пожалуйста, где в документации есть гайд по миграции с одного сервера, на другой?

Igor
14.01.2017
11:24:54
https://clickhouse.yandex/reference_ru.html#Манипуляции%20с%20партициями%20и%20кусками
где-то примерно там

Alexey
14.01.2017
15:23:31
Если таблица Replicated, то миграция очень простая - нужно создать на новом сервере реплику (CREATE TABLE), а после того, как она нальётся, удалить реплику на старом сервере.
Если таблица не Replicated, то тоже всё просто - надо скопировать данные и метаданные из файловой системы и перезапустить сервер.

?Zloool?
14.01.2017
15:30:27

f1yegor
14.01.2017
17:29:39
curl -H "Accept-Encoding: gzip, deflate" -s --write-out "size_download=%{size_download}\n" "localhost:8123/?enable_http_compression=1&query=..."
в каком формате получается на выходе при использованиее enable_http_compression=1 ?
ответ: из консоли это | gzip -d, а из яп пока не получилось

Slach
14.01.2017
18:33:24
Какой язык? На питоне zlib.decompress с выравниванием

f1yegor
14.01.2017
18:34:07
да на scala как обычно документация страдает

Google

Vladimir
14.01.2017
20:01:55
вопрос по плагину графаны. Если в таблице не присутствует колонка Datetime - должны ли возникать ошибка. .. Вопрос глупый, но создал простенькую таблицу и пытаюсь построить какой либо график в графане. Структура таблицы cho 'CREATE TABLE my_metrics (
date Date,
template UInt64,
object UInt64,
element UInt64,
user UInt64,
value Float32
) ENGINE=MergeTree(date, (template,object), 8192);
' | curl 'http://localhost:8123/?' —data-binary @-
при этом при запросе SELECT $timeSeries as t, value FROM my_metrics WHERE element = 1 AND $timeFilter GROUP BY t ORDER BY t
лезет ошибка. что я делаю не так

f1yegor
14.01.2017
20:03:26
я сделал тупо alter table <> add column <> DateTime MATERIALIZED (<how you calculate time>)
т.е. специально для этого плагина добавил еще одну колонку, которая больше нигде не видна

Vladimir
14.01.2017
20:04:49
))) спс сейчас попробую. Просто в логе такое Url /api/datasources/proxy/2/?query=SELECT (intDiv(toUInt32(undefined), 1800) * 1800) * 1000 as t, value FROM my_metrics WHERE element = 1 AND date BETWEEN toDate(1483216200) AND toDate(1485896400) AND undefined BETWEEN toDateTime(1483216200) AND toDateTime(1485896400) GROUP BY t ORDER BY t FORMAT JSON&add_http_cors_header=1
Method GET
Accept application/json, text/plain, */*
Request parameters
судя по всему undefined как раз и должен быть.

f1yegor
14.01.2017
20:05:24
ну да, ему нужна dateTime колонка

Vladimir
14.01.2017
20:05:48
Только тогда надо где то отразить что колонка должна быть)) А то на сайтике висит
Here you have to set database, table, WHERE-condition (if needed), Date:Col (EventDate column required for MergeTree engine), DateTime:Col (DateTime column is required only for our needs), selected columns.
// DateTime:Col is required for our time-based macros and funcs, because all analytics is based on these values
Part "Query" displays a current automatically built query based on previously selected values. Feel free to edit it according to your needs.
Ребят, исправьте хотя бы описание)) чтоб иссуе не открывать)
Спасибо заранее!

f1yegor
14.01.2017
20:07:15
я это описание раньше читал и понял все правильно. date нужно КХ, datetime нужно плагину. документация я считаю правильная
но я не автор
т.е. не правильна ваша интерпретация того что в документации написано

Vladimir
14.01.2017
20:08:41
(DateTime column is required only for our needs)

f1yegor
14.01.2017
20:09:00
ну то есть она REQUIRED

Vladimir
14.01.2017
20:09:00
не буду спорить все может быть...

f1yegor
14.01.2017
20:09:11
я тоже не буду

Roman
14.01.2017
20:36:13
А указать toDateTime(date) в качестве datetime колонки. Я что-то такое делал с unix-таймстемпами когда пробовал плагин

Google

Roman
14.01.2017
20:36:31
В плагие используются макросы и функции для которых эта колонка обязательна. Вы можете их не использовать, а строить запросы самостоятельно - тогда проблем возникнуть не должно. Поэтому, колонка EventTime не указана как обязательная.
В любом случае, чтобы строить графики по времени Вам понадобится колонка с типом DateTime

Vladimir
15.01.2017
21:12:16
Доброго времени суток всем бодрствующим! Ребята, кто нибудь делал накопительный отчет? Если да - то киньте примерчик. ? пытаюсь стандартный сделать - не срабатывает, так как судя по всему алиас таблицы нельзя использовать в подзапросе.

Roman
15.01.2017
21:31:14
Можете скинуть пример запроса?

Vladimir
15.01.2017
21:40:58
echo 'SELECT user,date,value,
(SELECT SUM(value)
FROM my_metrics
WHERE user = t.user AND date <= t.date) AS total
FROM my_metrics t
WHERE user = 1
ORDER BY user, date; ' | curl 'http://localhost:8123/?' —data-binary @-
Code: 47, e.displayText() = DB::Exception: Unknown identifier: t.user, e.what() = DB::Exception
для join пока не пробовал ? В этом же примере надо как то определить таблицу чтоб можно было ее в подзапросе использовать. Извините за глупые вопросы ))

f1yegor
15.01.2017
21:46:55
Алиасов нет, надо джойнить таблицу на саму себя

Vladimir
15.01.2017
21:47:57
Спасибо ?

f1yegor
15.01.2017
21:51:12
может помочь функция runningAccumulate https://github.com/yandex/ClickHouse/search?utf8=%E2%9C%93&q=runningAccumulate
наверное
ее в документации нет, но это похоже на runningDifference.
если это вас выручит - с вас документация на runningAccumulate )

Vladimir
15.01.2017
21:53:55
я только за ?

f1yegor
15.01.2017
22:00:30
?

papa
16.01.2017
02:13:12
в runningAccumulate нужен ключ для partition by, который будет резетить состояние агрегатной функции, если "runningEquals"(k)=0.
тогда получится что-то вроде
select date,user,runningAccumulate(v,user) from (
select date,user,sumState(value) as v
from my_metrics group by user,date order by user,date)
в текущем виде пользоваться им для agg(V) over(partition by K order by T) в общем случае невозможно, в случае суммы неудобно по сравнению с джойном на себя.
а текущий вариант оставить как ключ=пустой тупл, который всегда равен сам себе и никогда не резетит accumulate.


Kirill
16.01.2017
09:19:03
Всем привет, у меня есть несколько вопросов по "native" протоколу работы с сервером (https://github.com/yandex/ClickHouse/blob/master/dbms/include/DB/Core/Protocol.h).
Я устанавливаю соединене и пересылаю на сервер данные (hello), в случае если все "ОК" сервер отсылает мне версию и таймзону, тут все отлично
Если что-то не так, например некорректное имя базы, то сервер отсылает мне пакет Exception https://github.com/yandex/ClickHouse/blob/1d836b2bf8fef378d47258957ff74ed3a4aff136/dbms/src/IO/WriteHelpers.cpp#L6
например
code [81 0 0 0]
name DB::Exception <nil>
message DB::Exception: Database nodefault doesn't exist <nil>
StackTrace
0. clickhouse-server(StackTrace::StackTrace()+0x16) [0x1160446]
1. clickhouse-server(DB::Exception::Exception(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)+0x1f) [0x10a528f]
2. clickhouse-server(DB::TCPHandler::runImpl()+0x2ab) [0x10ba50b]
3. clickhouse-server(DB::TCPHandler::run()+0x2b) [0x10bb7cb]
4. clickhouse-server(Poco::Net::TCPServerConnection::start()+0xf) [0x2c2652f]
5. clickhouse-server(Poco::Net::TCPServerDispatcher::run()+0x14b) [0x2c4990b]
6. clickhouse-server(Poco::PooledThread::run()+0xb7) [0x33fe497]
7. clickhouse-server(Poco::ThreadImpl::runnableEntry(void*)+0xa5) [0x33ed9a5]
8. /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba) [0x7fdfbd59f6ba]
9. /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7fdfbcbc082d]
has_nested [0]
Тут у меня вопрос по сериализации типов пересылаемых по сети, со строками все более-менее понятно дина (uvariant) + строка в байтах, меня интересует формат других типов чтоб их можно было рассериализовать на клиенте (например "code" (int) little endian, big endian или что-то еще ...)
Query
Что такое query_id, id "подготовленного" запроса; что за "временные таблицы" которые необходимо отправлять в блоке Data; какое сжатие можно использовать и конечно, хотелось бы некоторое описание этих пакетов чтоб понимать что и зачем отсылается и форматы пересылаемых данных
Для inset запросов сервер отвечает структурой таблицы после чего ожидает начала передачи данных
например у меня есть 2-а запроса
insert into imps (a, b, c, d) values (?, ?, ?, ?)
и
insert into imps values (?, ?, ?, ?)
что я должен отослать на сервер в качестве query
оба
insert into imps
и отсылать данные в зависимости от порядка колонок в запросе
(a, b, c, d)
или сервер сам разберется
для запросов на получение данных как я понимаю 1-я часть идентична, отсылаем query после чего получаем названия и тыпы колонок и рассериализуем полученные данные (но тут тоже хочется описания форматов)
Если коротко: хочется описания некоторого flow работы и описания формаов/пакетов )


Igor
16.01.2017
10:22:04
query_id - просто id запроса строкой. клиент генерирует рандомные uuidы.
он используется для того, чтобы можно было потом replace_running_query сделать, например

Shine
16.01.2017
10:23:03
Ребят, подскажите. А есть ли возможность сделать так, чтобы кликхаус при джойне (там где нет данных) подставлял NULL, а не 0 или пустые строки. Если подставить Nullable в типы столбцов, которые джойнятся, сработает ? )

papa
16.01.2017
10:42:06
пока нет.

Google


Pavel
16.01.2017
10:45:29
Всем привет, у меня есть несколько вопросов по "native" протоколу работы с сервером (https://github.com/yandex/ClickHouse/blob/master/dbms/include/DB/Core/Protocol.h).
Я устанавливаю соединене и пересылаю на сервер данные (hello), в случае если все "ОК" сервер отсылает мне версию и таймзону, тут все отлично
Если что-то не так, например некорректное имя базы, то сервер отсылает мне пакет Exception https://github.com/yandex/ClickHouse/blob/1d836b2bf8fef378d47258957ff74ed3a4aff136/dbms/src/IO/WriteHelpers.cpp#L6
например
code [81 0 0 0]
name DB::Exception <nil>
message DB::Exception: Database nodefault doesn't exist <nil>
StackTrace
0. clickhouse-server(StackTrace::StackTrace()+0x16) [0x1160446]
1. clickhouse-server(DB::Exception::Exception(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)+0x1f) [0x10a528f]
2. clickhouse-server(DB::TCPHandler::runImpl()+0x2ab) [0x10ba50b]
3. clickhouse-server(DB::TCPHandler::run()+0x2b) [0x10bb7cb]
4. clickhouse-server(Poco::Net::TCPServerConnection::start()+0xf) [0x2c2652f]
5. clickhouse-server(Poco::Net::TCPServerDispatcher::run()+0x14b) [0x2c4990b]
6. clickhouse-server(Poco::PooledThread::run()+0xb7) [0x33fe497]
7. clickhouse-server(Poco::ThreadImpl::runnableEntry(void*)+0xa5) [0x33ed9a5]
8. /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba) [0x7fdfbd59f6ba]
9. /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7fdfbcbc082d]
has_nested [0]
Тут у меня вопрос по сериализации типов пересылаемых по сети, со строками все более-менее понятно дина (uvariant) + строка в байтах, меня интересует формат других типов чтоб их можно было рассериализовать на клиенте (например "code" (int) little endian, big endian или что-то еще ...)
Query
Что такое query_id, id "подготовленного" запроса; что за "временные таблицы" которые необходимо отправлять в блоке Data; какое сжатие можно использовать и конечно, хотелось бы некоторое описание этих пакетов чтоб понимать что и зачем отсылается и форматы пересылаемых данных
Для inset запросов сервер отвечает структурой таблицы после чего ожидает начала передачи данных
например у меня есть 2-а запроса
insert into imps (a, b, c, d) values (?, ?, ?, ?)
и
insert into imps values (?, ?, ?, ?)
что я должен отослать на сервер в качестве query
оба
insert into imps
и отсылать данные в зависимости от порядка колонок в запросе
(a, b, c, d)
или сервер сам разберется
для запросов на получение данных как я понимаю 1-я часть идентична, отсылаем query после чего получаем названия и тыпы колонок и рассериализуем полученные данные (но тут тоже хочется описания форматов)
Если коротко: хочется описания некоторого flow работы и описания формаов/пакетов )
Привет,
вы можете посмотреть код здесь: https://github.com/artpaul/clickhouse-cpp/blob/master/clickhouse/client.cpp
Он работает на приём данных. Отправку ещё не сделал.


Kirill
16.01.2017
11:04:15
да, спасибо, уже смотрю

Roman
16.01.2017
11:04:55
Существует возможность ограничит время выполнения запроса? К примеру, не больше 30с - иначе бросить исключение. В описании квот нашел только ограничение за интервал... Будет ли правильным указать квоту с интервалом в 60 и <execution_time>30</execution_time> ?

Igor
16.01.2017
11:06:26
max_execution_time и timeout_overflow_mode наверное

Roman
16.01.2017
11:41:18
спасибо

Shine
16.01.2017
11:52:09
упс, промазал

Yu
16.01.2017
12:09:18

Боб
16.01.2017
13:05:08
Можно ли как-то посчитать количество интервалов не меньше определенной длины, например нужно понять сколько интервалов длиной 3 есть для каждого ID-шника
ID Timestamp
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
2 2
2 6
2 10
3 1
надо посчитать результат:
1 3
2 3
3 1
Контекст использования:
по логам считать уникальных посетителей и если пользователь с тем же ID ходит регулярно, то раз в месяц считать его уникальным.

papa
16.01.2017
13:08:50
а точный результат сильно отличается от uniq((id,toStartOfMonth())) ?