
?
23.01.2018
11:45:41
спасибо, сейчас попробую
а примера использования ни у кого нет под рукой?

Roman
23.01.2018
11:48:31
https://github.com/valyala/chclient/blob/master/chclient_test.go#L28

?
23.01.2018
11:49:34
спасибо

Google

Vadim
23.01.2018
11:53:12
Привет всем!
Хочу кликхаус в класере с зукипером, но при добавлении карты метрик получаю:
CREATE TABLE graphite_tree
(
Date Date,
Level UInt32,
Path String,
Deleted UInt8,
Version UInt32
)
ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/{shard}/hits', '{replica}', Date, (Level, Path), 8192, Version)
Received exception from server (version 1.1.54337):
Code: 342. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Existing table metadata in ZooKeeper differs in mode of merge operation. Stored in ZooKeeper: 6, local: 5.
0 rows in set. Elapsed: 0.065 sec.
кто-то сталкивался?


Oleg
23.01.2018
11:57:09
что можно получить внятные сообщения об ошибках JDBC ? я получаю типа такого ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 27, host: ..., port: 8123; =#�MO��\u0018j��Y�\u000b�\u0011�\u0013\u0004\u0000\u0000- \u0000\u0000��!Code: 27, Cannot parse input: expected \t before: -710274372\t2\n2017\t12\t21\td70d4d074d687a01b0d0c574a4affd18158e1cfc26d7af8928d2c03e50a90ad9\t3-3c451f7f4289a6becb76f0ff8bcd5f80faed706eb09ed4b19f5d7b9ac67f324d\t1513: (at row 1519) я такое получаю после отправки prepared statement

Vadim
23.01.2018
11:57:28
хотя до того
CREATE TABLE graphite
(
Path String,
Value Float64,
Time UInt32,
Date Date,
Timestamp UInt32
)
ENGINE = ReplicatedGraphiteMergeTree('/clickhouse/tables/{shard}/hits', '{replica}', Date, (Path, Time), 8192, 'graphite_rollup')
Ok.

Ivan
23.01.2018
12:04:23
Коллеги,
Есть MergeTree и Distributed поверх MergeTree. Есть AggregatingMergeTree поверх этого MergeTree и Distributed таблица поверх AggregatingMergeTree. Записи делаются в MergeTree.
В MergeTree есть поле event_type типа Enum8 ('clicks' = 1, итд).
В AggregatingMergeTree делаются такие аггрегации countIfState(event_type = 'clicks') AS clicks_count.
Потом делаю запросы с доаггрегациям countIfMerge(clicks_count).
Но дело в том что данных в таких счетчиках как-то совсем не хватает, такое ощущение что он их просто пропускает. Если делаю запросы из MergeTree то все хорошо данные совпадают с другой нашей БД

Vadim
23.01.2018
12:05:52
/stat@combot

Combot
23.01.2018
12:05:52
combot.org/chat/-1001080295593

Felixoid
23.01.2018
12:11:10
хотя до того
CREATE TABLE graphite
(
Path String,
Value Float64,
Time UInt32,
Date Date,
Timestamp UInt32
)
ENGINE = ReplicatedGraphiteMergeTree('/clickhouse/tables/{shard}/hits', '{replica}', Date, (Path, Time), 8192, 'graphite_rollup')
Ok.
у Вас УЖЕ есть таблица в ЗК, вы пытаетесь создать новую. КХ ругается именно на то, что в ЗК уже лежит таблица, отличная от того, что Вы пытаетесь создать

Vadim
23.01.2018
12:11:48
таблицы разные, graphite / graphite_tree
каждую же можно реплицировать, нет?
@Felixoid спасибо за отклик

Felixoid
23.01.2018
12:12:25

Vadim
23.01.2018
12:12:46
ок, сек

Google

Vadim
23.01.2018
12:13:32
теперь все ОК, спасибо

Mikhail
23.01.2018
12:50:46
Коллеги, а из опыта - никогда не сталкивались с обрывом соединения CH с mysql (получение словарей) при загрузке исходящей сети на 100% репликацией?
Есть несколько серверов, свежеобновленных. На одном - ошибки связи с mysql, на остальных все ок. Отличие - нагруженная сеть.


Oleg
23.01.2018
13:46:40
как заставить драйвер JDBC присылать более осмысленный текст ошибки ?
ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier: Unsupported ClickHouse error format, please fix ClickHouseExceptionSpecifier, message: �� ��k��}?��~��� A ��Code: 27, e.displayText() = DB::Exception: Cannot parse input: expected \t before: -1662207888\t1\n2016\t10\t11\t816893574f48e019e4c0aabfcb0949aa535f49e8c5083341da003d02cef9cf78\t3-81da85cce9ad0a99478bb33c17eb3fad1f3103f78db1d37177f3d580f3f47781\t201: (at row 11)
R �
0:
Column 0, name: year �type: UInt16 �d text: "2017"E 1 E Pmonth E 8
C %21C 36 C �field_id,C `String%
�33-288aa4025f14b84a5f1b40cd4f4acf5744f4d06723c430e239a6d2a5c943b49d� 5� �field2_date G D � G-12-O � � �field3,K O t<EMPTY> 7| F �field6 � F �"field4� ? H �field5� �
5"USC 9y C � Tfield7� RTime,� � � 19:51:0� @
T ens % T " O T �field8� � � 30
� U54976� 1" F Ffield9E � F #1"$ 1$ �} � 6 $ �M000: 9� $ /w21:19:3x $ aERROR:� & "P" is Alike� @32
;wha Ption
, error: For input string: "��k��}?��~��� A ��Code: 27"
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.1.34</version>


Dmitry
23.01.2018
13:50:56
у меня без кракозябр, но тоже непонятно
2018.01.23 15:30:20.061130 [ 15 ] <Error> ExternalDictionaries: Failed reloading 'managedobject' dictionary: Code: 27, e.displayText() = DB::Exception: Cannot parse input: expected \t before: \n2694955293548476466\t3\tC3560-8\t10.111.0.8\n8141130780283766859\t4\tC3560-15\t10.111.0.15\n4864262177964422856\t5\tJuniper MX5-T\t10.111.0.21\n4403641040019216150\t6\tRB301: (at row 1)
Row 1:
Column 0, name: bi_id, type: UInt64, parsed text: "534697644907619486"
Column 1, name: id, type: String, parsed text: "2"
Column 2, name: name, type: String, parsed text: "C3560-16"
Column 3, name: address, type: String, parsed text: "10.111.0.16"
ERROR: Line feed found where tab is expected. It's like your file has less columns than expected.
And if your file have right number of columns, maybe it have unescaped backslash in value before tab, which cause tab has escaped.

Дмитрий
23.01.2018
13:51:31


Maxim
23.01.2018
14:06:31
такое сыпется когда у вас размерность поля не совпадает с описанным типом в базе (ну суете -1 в uint8)

Vsevolod
23.01.2018
14:07:15
kdb style

Natalya
23.01.2018
14:39:39
Всем привет! кто-нибудь пробовал дружить комбинаторы -If и -Array? как правильно указать условие? в качестве второго аргумента почему-то просит UInt8...

Oleg
23.01.2018
14:39:40
-Dfile.encoding=utf-8 в целом помогло, спасибо, но есть отдельные непонятки типа m����{�:
� )US_j�} ~ �

Nikolai
23.01.2018
14:50:38

Natalya
23.01.2018
14:52:04
и как задать условие не очень понятно

Nikolai
23.01.2018
14:54:13
SELECT length(arrayFilter(x -> (x > 3), a))
FROM
(
SELECT arrayJoin([[1, 2], [3, 4], [5, 6]]) AS a
)
┌─length(arrayFilter(lambda(tuple(x), greater(x, 3)), a))─┐
│ 0 │
│ 1 │
│ 2 │
└─────────────────────────────────────────────────────────┘

Natalya
23.01.2018
14:56:41
SELECT length(arrayFilter(x -> (x > 3), a))
FROM
(
SELECT arrayJoin([[1, 2], [3, 4], [5, 6]]) AS a
)
┌─length(arrayFilter(lambda(tuple(x), greater(x, 3)), a))─┐
│ 0 │
│ 1 │
│ 2 │
└─────────────────────────────────────────────────────────┘
Николай, спасибо
думала, это возможно реализовать комбинаторами...

Mariya
23.01.2018
14:59:47

Natalya
23.01.2018
15:00:10

papa
23.01.2018
15:02:24

Дмитрий
23.01.2018
15:03:24

Google

Natalya
23.01.2018
15:04:49

pavel
23.01.2018
15:30:12
Привет.
Есть
CREATE MATERIALIED VIEW .. AS SELECT ... FROM t1
Но хочется чтобы оно только создалось, а данные туда не сыпались по инсерту в связанную t1.
Может это делается так?
CREATE TABLE ... AS SELECT ... FROM t1
?

Nikolai
23.01.2018
15:34:18
а как это MATERIALIED VIEW должно себя вести? почему просто VIEW не подходит?

pavel
23.01.2018
15:36:39
Хочется сделать табличку на движке MergeTree, но нормального CREATE для неё нет. Есть вот такой - от вьюшки. Но табличка должна быть материальная и жрать место. Просто авто-инсерты отрубить. Хочу фичу умертвления MV короче)

Natalya
23.01.2018
15:39:18
а почему нельзя просто создать таблицу и сделать в нее insert select?

Nikolai
23.01.2018
15:40:57

Oleg
23.01.2018
16:25:58
Вечер добрый! Прошу прощения если уже обсуждалось тыщу раз, но как кто борется с дублями записей? ReplacingMergeTree вполне справляется, если дубли балансить шард кеем на одну ноду, но вот существует окно пока не произошло слияние, когда обе записи живут и попадают в выборки и аггрегации

Kirill
23.01.2018
16:30:03
У нас немного другой кейс, но мы убираем дубли при помощи LIMIT N BY https://clickhouse.yandex/docs/ru/single/#sekcziya-limit-n-by
т.е. данные сортируются, а потом накладывается условие сколько первых строк по такому-то ключу оставить

Oleg
23.01.2018
16:33:18
хм, наверное не подходит, потому что мне нужны все строки для агрегации, но само собой минус дубли

Kirill
23.01.2018
16:37:48
там и будут все строки, а дубли можно лимитом срезать если отсортировать по close или что там у вас.

Oleg
23.01.2018
16:38:23
сейчас попробую, спасибо

Kirill
23.01.2018
16:44:50
сейчас попробую, спасибо
CREATE TABLE example (
ID String,
Open UInt8,
Closed UInt8,
Amount Float64
) Engine = Memory;
INSERT INTO example VALUES
('A', 1, 0, 42.2),
('A', 1, 1, 42.2),
('B', 1, 0, 36.6);
SELECT * FROM example ORDER BY ID, Closed LIMIT 1 BY ID;

Oleg
23.01.2018
16:52:10
круто, работает, спасибо)


Vadim
23.01.2018
19:30:38
Доброго дня. Столкнулся с такой ситуацией:
Есть кластер из 4 машин: 2 щарда, у каждого по две реплики
Таблицы:
events_Local - replicated merge tree на каждой машине,
events_Dist - distributed поверх events_Local
1_min_aggregates_Local - replicated merge tree на каждой машине
1_min_aggregates_Dist - distributed поверх 1_min_aggregates_Local
60_min_aggregates_Local - replicated merge tree на каждой машине
60_min_aggregates_Dist - distributed поверх 60_min_aggregates_Local
Последовательно выполняются 2 запроса. Каждый может уйти на любой из 4 хостов:
1. insert into 1_min_aggregates_Local select ... from events_Local (входной поток группируется по минутам)
2. insert into 60_min_aggregates_Local select ... from 1_min_aggregates_Dist (поток группируется по часам)
С вероятность примерно 30% второй запрос ничего не вставляет (хотя данные есть).
Если я вставляю sleep 500ms между запросами - вероятность ошибки падает до нуля.
Собственно, вопросы:
Правильно ли я понимаю, что выполненый insert в локальную таблицу еще не гарантирует, что данные тут же будут доступны в Distributed?
Если такое поведение адекватно, то как гарантировать доставку данных после первого запроса вместо костылей из sleep'а?


Alexey
23.01.2018
19:33:10


Vadim
23.01.2018
19:42:38
В моем случае, я как раз вставлял данные в таблицы Local. Попробую включить опцию и вставлять в distributed, спасибо.

Alexey
23.01.2018
19:43:43
Репликация тоже по-умолчанию асинхронная.

Alexey
23.01.2018
20:17:13
если дистрибютед таблица на какое-то время потеряет связь с тем, на что она указывает, и в нее будут вставлять данные, то они будут копиться в локальном clickhouse (в структуре FS) и потом, когда соединение восстановиться доедут до цели?

Google

Alexey
23.01.2018
20:19:41
Да. Вроде нормальная идея. Только не забывайте мониторить эту очередь (изнутри возможности узнать размер этой очереди нельзя).

Alexey
23.01.2018
20:22:16
спасибо, мониторить каталог будем

Alex
23.01.2018
21:06:27

Pavel
23.01.2018
22:29:44
а нет ли планов ввести поля у самой схемы таблицы, которые можно редактировать?
у меня напрашивается идея сделать миграцию схему в своем приложении, но сейчас приходится делать это эвристически "если есть вот эти поля, то версия - вот такая"
в идеале хотелось бы возможность записать хотя бы строчку в саму схему таблицы, чтобы софт запускался, проверял версию и ничего не трогал, если версия его устраивает

Alexey
23.01.2018
22:31:04

Pavel
23.01.2018
22:31:16
вполне устроило бы :)
я бы даже сказал - именно то, что нужно :)

Alexey
23.01.2018
22:41:51
https://github.com/yandex/ClickHouse/issues/1815#issue-291019931
- а теперь придётся найти того, кто сделает.

Pavel
23.01.2018
22:46:10
потрясающе, спасибо :)

Andy
23.01.2018
22:47:24

Pavel
23.01.2018
22:47:53
сложно, мне нравится решение иметь поле прямо в схеме
я не пытаюсь писать полноценный мигратор схемы, скорее пытаюсь мимикрировать под то, что дали. если схема старая - просто не пишу часть полей :)
но определить что она старая когда миграций 5-10 позади.. ад :(
ну и таблица отдельная может более вероятно стать неконсистентной

Andy
23.01.2018
22:49:42

Alexey
23.01.2018
22:55:36
Также можете попробовать использовать для этой цели ненужный ALIAS столбец. Вот так:
...
comment ALIAS 'Hello, world'

Pavel
23.01.2018
23:43:24
да, кстати, тоже вариант!
спасибо :)

Google

Alexey
23.01.2018
23:51:09
Если подойдёт этот вариант, то созданную задачу можно по-быстрому отменить.

Сергей
24.01.2018
05:55:49

Andrey
24.01.2018
08:15:59
INSERT INTO akonyaev.content_app_version_mapi_history SELECT
today(),
content_id,
arrayJoin(arrayMap(x -> toUInt32(x), splitByChar(',', versions_with_allowed_formats)))
FROM dictionaries.content_app_version_mapiПадает по памяти
DB::Exception: Memory limit (for query) exceeded: would use 13.00 GiB (attempt to allocate chunk of 4294967296 bytes), maximum: 9.31 GiB.Как я понимаю, запрос сначала пытается посчитать select, а потом сделать insert. Так как нет никаких группировок и прочего - то по идее данные можно было бы вставлять сразу по ходу выполнения запроса. Есть ли такой функционал?

Ololo
24.01.2018
09:16:02
Если в replacingmergetree сделать optimize во время вставки большой порции данных, то, кажется, всё ломается. Кто-нибудь сталкивался с таким?
Кажется, будто часть столбцов смещается относительно другой части.


Kirill
24.01.2018
09:17:29
INSERT INTO akonyaev.content_app_version_mapi_history SELECT
today(),
content_id,
arrayJoin(arrayMap(x -> toUInt32(x), splitByChar(',', versions_with_allowed_formats)))
FROM dictionaries.content_app_version_mapiПадает по памяти
DB::Exception: Memory limit (for query) exceeded: would use 13.00 GiB (attempt to allocate chunk of 4294967296 bytes), maximum: 9.31 GiB.Как я понимаю, запрос сначала пытается посчитать select, а потом сделать insert. Так как нет никаких группировок и прочего - то по идее данные можно было бы вставлять сразу по ходу выполнения запроса. Есть ли такой функционал?
Он так и должен делать, по мере того как поступают данные он пишет, если для того чтоб отдать данные нужно что-то большое посчитать может упасть, либо тут баг какой-то

Tima
24.01.2018
09:17:54