Обработка null-значений

571 views
Skip to first unread message

Stepan Semiokhin

unread,
Jul 15, 2016, 2:23:39 AM7/15/16
to ClickHouse
Добрый день!

В документации ясно написано, что NULL не поддерживается, в связи с этим такой вопрос: насколько трудоемким будет допиливание такого функционала в кликхаус и откуда лучше начать смотреть?

NULL-ы необходимы для Int-овых столбцов.
0/-1/-999 в качестве нуллов не подходят, т.к. тоже могут являться содержательными значениями.

man...@gmail.com

unread,
Jul 15, 2016, 3:29:25 AM7/15/16
to ClickHouse
В документации ясно написано, что NULL не поддерживается, в связи с этим такой вопрос: насколько трудоемким будет допиливание такого функционала в кликхаус и откуда лучше начать смотреть?
 
Мы как раз занимаемся добавлением ограниченной поддержки NULL.


NULL-ы необходимы для Int-овых столбцов.
0/-1/-999 в качестве нуллов не подходят, т.к. тоже могут являться содержательными значениями.

Проще всего сделать ещё один столбец.
Например, если у вас есть столбец Value, добавьте ещё столбец ValuePresent UInt8, равный 1, если значение Value имеет смысл и 0, если нет.
Затем его легко использовать в запросах. При фильтрации: WHERE ValuePresent; при вычислении агрегатных функций: avgIf(Value, ValuePresent) и т. п.

Stepan Semiokhin

unread,
Jul 15, 2016, 4:00:02 AM7/15/16
to ClickHouse
Спасибо, очень хорошая новость!

А когда ориентировочно можно ожидать эту поддержку?

man...@gmail.com

unread,
Jul 15, 2016, 4:29:13 AM7/15/16
to ClickHouse
Предположительно, в районе месяца.

Но я рекомендую не ждать: вариант с отдельным столбцом работает не хуже в плане эффективности.

Stepan Semiokhin

unread,
Jul 15, 2016, 4:53:22 AM7/15/16
to ClickHouse
Спасибо, сейчас попробую, думал еще поиграться с MATERIALIZED-столбцами в качестве флага для базового столбца.

Например, установить DEFAULT значение у базового столбца в −2 147 483 648 (такого точно не будет), а MATERIALIZED столбец дает 0 в случае, если базовый столбец равен −2 147 483 648, иначе 1
Message has been deleted

Stepan Semiokhin

unread,
Jul 15, 2016, 6:12:40 AM7/15/16
to ClickHouse
Такой вопрос: вы не подскажите, возможно ли использование DEFAULT-значений при загрузке данных TabSeparated или CSV, не указывая явно столбцы, которые мы добавляем?
Т.е. если я пытаюсь загрузить в таблицу:

col1 Int32
col2 String DEFAULT 'UNDEFINED'
col3 Int32 DEFAULT 10
col4_date Date

данные в CSV: 

1,,,1950-01-01

Я поучаю в таблице: | 1 |   | 0 | 1950-01-01 |
т.е. пустые строки или 0 в случае чисел.

Можно указать явно "INSERT INTO table (col1, col4_date)", и тогда будут использованы дефолтные значения, но тогда одним инсертом все не загрузить.

Я понимаю, что вряд ли это как-то можно обойти, но вдруг я чего-нибудь не увидел)

man...@gmail.com

unread,
Jul 15, 2016, 7:03:39 AM7/15/16
to ClickHouse
Всё-таки пропуск значения - это корректный способ кодирования пустой строки в CSV.
Поэтому непонятно, как отличить это от необходимости использовать default.

Как обойти: создать временную таблицу (например, ENGINE = Log), вставить туда данные как есть (с пустыми строками), а затем сделать INSERT INTO final_table SELECT s = '' ? 'UNDEFINED' : s AS s, ... FROM temporary_table.

Была идея, чтобы такое преобразование можно использовать непосредственно при INSERT-е.

Stepan Semiokhin

unread,
Jul 15, 2016, 7:16:10 AM7/15/16
to ClickHouse
Да, понятно, что не отличить....

Спасибо большое, будем экспериментировать :) 
Reply all
Reply to author
Forward
0 new messages