Вставка в Distrubuted table с Materialized-полем

375 views
Skip to first unread message

Seva Kobylin

unread,
Jul 14, 2016, 6:34:09 AM7/14/16
to ClickHouse
Добрый день,

Сразу скажу, что вопрос больше к документации, но всё же запрошу уточнения :)

Есть кластер с 2 шардами (с двумя репликами в каждой)

Есть t с полем
> envdate MATERIALIZED toDate(created)

Distributed table на указанную таблицу создается, отрабатывает отлично, но!
При попытке вставки в distributed table при попадании на "чужой" шард данные отказывают вставляться:

[ 13 ] <Error> executeQuery: Code: 44, e.displayText() = DB::Exception: Cannot insert column envdate, e.what() = DB::Exception, Stack trace:

0. clickhouse-server(StackTrace::StackTrace()+0xe) [0xfbb19e]
1. clickhouse-server(DB::Exception::Exception(std::string const&, int)+0x1e) [0xf55fbe]
2. clickhouse-server(DB::ProhibitColumnsBlockOutputStream::write(DB::Block const&)+0x86) [0x292d616]
3. clickhouse-server(DB::TCPHandler::receiveData()+0x8c) [0xf720dc]
4. clickhouse-server(DB::TCPHandler::receivePacket()+0x65) [0xf724e5]
5. clickhouse-server(DB::TCPHandler::readData(DB::Settings const&)+0x18a) [0xf7298a]
6. clickhouse-server(DB::TCPHandler::processInsertQuery(DB::Settings const&)+0x4b) [0xf72a9b]
7. clickhouse-server(DB::TCPHandler::runImpl()+0x697) [0xf74257]
8. clickhouse-server(DB::TCPHandler::run()+0x17) [0xf74eb7]
9. clickhouse-server(Poco::Net::TCPServerConnection::start()+0x7) [0x2a36d67]
10. clickhouse-server(Poco::Net::TCPServerDispatcher::run()+0x107) [0x2a6d827]
11. clickhouse-server(Poco::PooledThread::run()+0x7f) [0x2ffdd2f]
12. clickhouse-server(Poco::ThreadImpl::runnableEntry(void*)+0x87) [0x3029277]
13. /lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a) [0x7f262a81ee9a]
14. /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7f2629e4436d]

[ 13 ] <Error> void DB::BlockIO::onException(): Code: 101, e.displayText() = DB::NetException: Unexpected packet Data received from client, e.what() = DB::NetException, Stack trace:

0. clickhouse-server(StackTrace::StackTrace()+0xe) [0xfbb19e]
1. clickhouse-server(DB::Exception::Exception(std::string const&, int)+0x1e) [0xf55fbe]
2. clickhouse-server(DB::TCPHandler::receivePacket()+0x2b9) [0xf72739]
3. clickhouse-server(DB::TCPHandler::runImpl()+0x541) [0xf74101]
4. clickhouse-server(DB::TCPHandler::run()+0x17) [0xf74eb7]
5. clickhouse-server(Poco::Net::TCPServerConnection::start()+0x7) [0x2a36d67]
6. clickhouse-server(Poco::Net::TCPServerDispatcher::run()+0x107) [0x2a6d827]
7. clickhouse-server(Poco::PooledThread::run()+0x7f) [0x2ffdd2f]
8. clickhouse-server(Poco::ThreadImpl::runnableEntry(void*)+0x87) [0x3029277]
9. /lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a) [0x7f262a81ee9a]
10. /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7f2629e4436d]

man...@gmail.com

unread,
Jul 14, 2016, 9:50:30 PM7/14/16
to ClickHouse
Добрый день.

Это недоработка. Поле материализуется уже при вставке в Distributed-таблицу, и затем пытается вставиться в удалённую таблицу, которая не позволяет это сделать.

Для того, чтобы обойти это, просто используйте DEFAULT вместо MATERIALIZED.

Никита

unread,
Oct 19, 2016, 9:36:24 AM10/19/16
to ClickHouse
Здравствуйте.

Я тоже сейчас на это наткнулся. Это будет исправлено? (Или, может быть, уже исправили? Версия у меня не самая новая). Если нет, то надо бы в документации это отметить.

Насколько я понял, если просто использовать DEFAULT вместо MATERIALIZED, пропадает возможность вставки данных без предварительной обработки - приходится добавлять пустые места для вычислимого поля.
Я вместо этого оставил в распределенной таблице поле MATERIALIZED, а в локальной сделал DEFAULT. Вроде работает. (Правда теперь в распределенную и в локальную по-разному вставлять нужно)

man...@gmail.com

unread,
Oct 20, 2016, 7:38:54 PM10/20/16
to ClickHouse
Это ещё не исправлено.


Насколько я понял, если просто использовать DEFAULT вместо MATERIALIZED, пропадает возможность вставки данных без предварительной обработки - приходится добавлять пустые места для вычислимого поля.

Не обязательно. Достаточно указать список вставляемых полей при INSERT:
INSERT INTO table (columns list) ...

Тогда для остальных (не указанных) столбцов будут вычислены значения по-умолчанию.

Reply all
Reply to author
Forward
0 new messages