Size: a a a

ClickHouse не тормозит

2020 August 31

GR

Gubaydullin Ruslan in ClickHouse не тормозит
Добрый день
у меня есть таблица типа collapsing merge tree
мне нужно обновить данные в каждой строке таблицы
есть два варианта:
1. для каждой строки: ALTER TABLE tablename UPDATE field = 'value' WHERE id = x
2. для каждой строки INSERT INTO tablename (sign, field1, field2, ...) VALUES (-1, ...), (1, ...)

какой из вариантов следует использовать?
спасибо
источник

D

Dj in ClickHouse не тормозит
лучше 3:
CREATE table newTable () ...;
INSERT INTO newTable SELECT a,b, updated(c) from oldTable;
drop table oldTable;
источник

D

Dj in ClickHouse не тормозит
Gubaydullin Ruslan
Добрый день
у меня есть таблица типа collapsing merge tree
мне нужно обновить данные в каждой строке таблицы
есть два варианта:
1. для каждой строки: ALTER TABLE tablename UPDATE field = 'value' WHERE id = x
2. для каждой строки INSERT INTO tablename (sign, field1, field2, ...) VALUES (-1, ...), (1, ...)

какой из вариантов следует использовать?
спасибо
^^^
источник

SK

Sergey Kotyushkin in ClickHouse не тормозит
Mishanya
гайз, а как можно сгруппировать данные по массиву ?

value group_field
10       [1,2]
20       [2,3]

————

group_field v
1                   10
2                   30
3                    20
можно так
select group_field, sum(value) v
from
(
 select 10 value, [1, 2] group_field
 union all select 20 value, [2, 3] group_field
)
array join group_field
group by group_field
источник

GR

Gubaydullin Ruslan in ClickHouse не тормозит
а что лучше первый или второй способ?
источник

GR

Gubaydullin Ruslan in ClickHouse не тормозит
данные нужно единоразово обновить
источник

A

Alexandr in ClickHouse не тормозит
Добрый день! а можно как-то кумулятивную сумму посчитать? например есть продажи за каждый месяц, и хочется для каждого месяца видеть накопленную сумму за прошлые месяца?
источник

D

Dj in ClickHouse не тормозит
Gubaydullin Ruslan
а что лучше первый или второй способ?
если все инсерты одним махом вставите, второй...
если собрались построчно - первый... но при падении КХ данные могут быть в недетерминированном состояниии
источник

ЕК

Евгений Король... in ClickHouse не тормозит
Добрый день, господа. У меня есть вопрос. Я создал таблицу

CREATE TABLE IF NOT EXISTS forms_log (
   uid FixedString(8),
   sequence_id FixedString(8),
   form_id UInt32,
   question_id UInt32,
   answer_id UInt32,
   is_correct UInt8,
   event_type Enum8('load' = 1, 'show' = 2, 'result' = 3, 'completed' = 4, 'session_active' = 5),
   session_tick_interval UInt32,
   domain_id UInt32,
   widget_id UInt32,
   ctime DateTime,
   event_date Date ALIAS toDate(ctime)
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/forms_log', '{replica}')
ORDER BY ( ctime, form_id, question_id, answer_id, event_type  )
SETTINGS index_granularity=8192;

но забыл сделать ей партиционирование по дню, а там уже накопилось данных прилично, можно ли добавить как-то partition by в существующую таблицу?
источник

EM

Evgeny Makarov in ClickHouse не тормозит
Alexandr
Добрый день! а можно как-то кумулятивную сумму посчитать? например есть продажи за каждый месяц, и хочется для каждого месяца видеть накопленную сумму за прошлые месяца?
можно с использованием arrayCumSum
CREATE TABLE test_cumsum (pk Integer, pk2 Integer, value Integer) ENGINE MergeTree() ORDER BY (pk);
insert into test_cumsum values (0,1), (1,1), (2,2), (3,1);
select * from test_cumsum order by pk2;

SELECT *
FROM test_cumsum
ORDER BY pk2 ASC

┌─pk─┬─pk2─┬─value─┐
│  3 │   1 │     1 │
│  2 │   2 │     2 │
│  1 │   3 │     1 │
│  0 │   4 │     1 │
└────┴─────┴───────┘

4 rows in set. Elapsed: 0.002 sec.
select arrayCumSum(groupArray(value)) from (select pk, value from test_cumsum order by pk);
┌─arrayCumSum(groupArray(value))─┐
│ [1,2,4,5]                      │
└────────────────────────────────┘
select arrayCumSum(groupArray(value)) from (select pk2, value from test_cumsum order by pk2);
┌─arrayCumSum(groupArray(value))─┐
│ [1,3,4,5]                      │
└────────────────────────────────┘
источник

A

Alexandr in ClickHouse не тормозит
Evgeny Makarov
можно с использованием arrayCumSum
CREATE TABLE test_cumsum (pk Integer, pk2 Integer, value Integer) ENGINE MergeTree() ORDER BY (pk);
insert into test_cumsum values (0,1), (1,1), (2,2), (3,1);
select * from test_cumsum order by pk2;

SELECT *
FROM test_cumsum
ORDER BY pk2 ASC

┌─pk─┬─pk2─┬─value─┐
│  3 │   1 │     1 │
│  2 │   2 │     2 │
│  1 │   3 │     1 │
│  0 │   4 │     1 │
└────┴─────┴───────┘

4 rows in set. Elapsed: 0.002 sec.
select arrayCumSum(groupArray(value)) from (select pk, value from test_cumsum order by pk);
┌─arrayCumSum(groupArray(value))─┐
│ [1,2,4,5]                      │
└────────────────────────────────┘
select arrayCumSum(groupArray(value)) from (select pk2, value from test_cumsum order by pk2);
┌─arrayCumSum(groupArray(value))─┐
│ [1,3,4,5]                      │
└────────────────────────────────┘
спасибо!
источник

M

Maxim Bogdanov in ClickHouse не тормозит
Подскажите плз, кто разбирается в MergeTree. Я правильно понимаю, что на каждую Part строится свой отсортированный индекс и в несольких индексах вполне могут пересекаться значения, но при этом во время итерирования одинаковые значения не обязательно будут идти последовательно?

Part 1:
A 2
B 4
C 6

Part 2
A 1
B 3
C 5

Я ожидаю:
A 1
A 2
B 3
B 4
C 5
C 6

А итератор ClickHouse по идее идёт так:
A 2
B 4
C 6
A 1
B 3
C 5


Если не так, то он же не будет сортировать части в памяти, верно? Да и вроде для выборок это не нужно (кроме sequenceMatch).
Я так понимаю, чтобы добиться нужного кейса, нужно либо смерджить всё в одну парт, либо в памяти при запросе эти парты сортировать, либо скакать по данным ещё как-то. Все варианты очень медленные.
источник

D

Dj in ClickHouse не тормозит
Maxim Bogdanov
Подскажите плз, кто разбирается в MergeTree. Я правильно понимаю, что на каждую Part строится свой отсортированный индекс и в несольких индексах вполне могут пересекаться значения, но при этом во время итерирования одинаковые значения не обязательно будут идти последовательно?

Part 1:
A 2
B 4
C 6

Part 2
A 1
B 3
C 5

Я ожидаю:
A 1
A 2
B 3
B 4
C 5
C 6

А итератор ClickHouse по идее идёт так:
A 2
B 4
C 6
A 1
B 3
C 5


Если не так, то он же не будет сортировать части в памяти, верно? Да и вроде для выборок это не нужно (кроме sequenceMatch).
Я так понимаю, чтобы добиться нужного кейса, нужно либо смерджить всё в одну парт, либо в памяти при запросе эти парты сортировать, либо скакать по данным ещё как-то. Все варианты очень медленные.
Скан параллельно идет, что в одном парте что в нескольких. Хотите ордер гарантию  - делаете ордер бай
источник

D

Dj in ClickHouse не тормозит
Maxim Bogdanov
Подскажите плз, кто разбирается в MergeTree. Я правильно понимаю, что на каждую Part строится свой отсортированный индекс и в несольких индексах вполне могут пересекаться значения, но при этом во время итерирования одинаковые значения не обязательно будут идти последовательно?

Part 1:
A 2
B 4
C 6

Part 2
A 1
B 3
C 5

Я ожидаю:
A 1
A 2
B 3
B 4
C 5
C 6

А итератор ClickHouse по идее идёт так:
A 2
B 4
C 6
A 1
B 3
C 5


Если не так, то он же не будет сортировать части в памяти, верно? Да и вроде для выборок это не нужно (кроме sequenceMatch).
Я так понимаю, чтобы добиться нужного кейса, нужно либо смерджить всё в одну парт, либо в памяти при запросе эти парты сортировать, либо скакать по данным ещё как-то. Все варианты очень медленные.
Данные отсортированы уже на диске... По мере чтения кх будет возвращать сортированные данные
источник

M

Maxim Bogdanov in ClickHouse не тормозит
Dj
Скан параллельно идет, что в одном парте что в нескольких. Хотите ордер гарантию  - делаете ордер бай
Ну да, я это и имел ввиду. Через ордер бай. Интересно, есть ли структура данных, которая всегда отсортирована, возможно LSM подойдёт.
источник

D

Dj in ClickHouse не тормозит
Maxim Bogdanov
Ну да, я это и имел ввиду. Через ордер бай. Интересно, есть ли структура данных, которая всегда отсортирована, возможно LSM подойдёт.
МТ отсортирован. Неясно чего вы хотите
источник

M

Maxim Bogdanov in ClickHouse не тормозит
Dj
Данные отсортированы уже на диске... По мере чтения кх будет возвращать сортированные данные
Это я понимаю, но они отсортированы в каждой части локально, а не глобально по всему датасету. Я привёл вверху эфимерный датасет, который по идее так и интерпретируется кликхаусом, если не юзать ордербай.
источник

ЕК

Евгений Король... in ClickHouse не тормозит
Евгений Король
Добрый день, господа. У меня есть вопрос. Я создал таблицу

CREATE TABLE IF NOT EXISTS forms_log (
   uid FixedString(8),
   sequence_id FixedString(8),
   form_id UInt32,
   question_id UInt32,
   answer_id UInt32,
   is_correct UInt8,
   event_type Enum8('load' = 1, 'show' = 2, 'result' = 3, 'completed' = 4, 'session_active' = 5),
   session_tick_interval UInt32,
   domain_id UInt32,
   widget_id UInt32,
   ctime DateTime,
   event_date Date ALIAS toDate(ctime)
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/forms_log', '{replica}')
ORDER BY ( ctime, form_id, question_id, answer_id, event_type  )
SETTINGS index_granularity=8192;

но забыл сделать ей партиционирование по дню, а там уже накопилось данных прилично, можно ли добавить как-то partition by в существующую таблицу?
@den_crane что Вы думаете по этому поводу? =)
источник

D

Dj in ClickHouse не тормозит
Maxim Bogdanov
Это я понимаю, но они отсортированы в каждой части локально, а не глобально по всему датасету. Я привёл вверху эфимерный датасет, который по идее так и интерпретируется кликхаусом, если не юзать ордербай.
Даже если у вас один парт, селект без ордер бай вернет вам данные вразброс
источник

D

Dj in ClickHouse не тормозит
Евгений Король
Добрый день, господа. У меня есть вопрос. Я создал таблицу

CREATE TABLE IF NOT EXISTS forms_log (
   uid FixedString(8),
   sequence_id FixedString(8),
   form_id UInt32,
   question_id UInt32,
   answer_id UInt32,
   is_correct UInt8,
   event_type Enum8('load' = 1, 'show' = 2, 'result' = 3, 'completed' = 4, 'session_active' = 5),
   session_tick_interval UInt32,
   domain_id UInt32,
   widget_id UInt32,
   ctime DateTime,
   event_date Date ALIAS toDate(ctime)
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/forms_log', '{replica}')
ORDER BY ( ctime, form_id, question_id, answer_id, event_type  )
SETTINGS index_granularity=8192;

но забыл сделать ей партиционирование по дню, а там уже накопилось данных прилично, можно ли добавить как-то partition by в существующую таблицу?
Нет. Пересоздавайте. Можете покрыть mergeengine чтоб апп не страдал
источник