DateTime и временные зоны. Помогите разобраться.

2,248 views
Skip to first unread message

Maxim Savenko

unread,
Feb 3, 2017, 7:36:44 AM2/3/17
to ClickHouse

Помогите разобраться с значениями DateTime. У нас есть несколько 3 ноды кликхауза. На кождом из них работают процедуры импорта данных в таблицы со структурой:

CREATE TABLE traffic_part (
date Date,
date_time DateTime,
/*
... other fields
*/
)
ENGINE = MergeTree(date, intHash32(ip), (site_id, type_id, item_id, date, intHash32(ip)), 8192);


Для каждой пачки данных на основе такой таблицы создаются таблички с именами ~^traffic_hr_~. На каждой из нод создана сводное представление на движке Merge:

CREATE TABLE traffic_local AS traffic_part ENGINE = Merge(currentDatabase(),'^traffic_hr_');

И существует распределенная таблица, объединяющая все эти данные со всех нод:

CREATE TABLE traffic AS traffic_local ENGINE=Distributed(logs,currentDatabase(),traffic_local,rand());


Все это установлено на железяках где ОС таймзона установлена в EST (−5 часов от UTC). Данные импортируются через clickhouse-client, который тоже запуcкается в окружении с системной таймзоной.

Теперь к вопросу. Делаем следующие запросы и видим такие результаты:

SELECT date_time
FROM tf.traffic 
WHERE (date = '2017-01-29') AND (date_time = '2017-01-29 13:59:59')
LIMIT 10

┌───────────date_time─┐
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
└─────────────────────┘



следующий запрос:

SELECT date_time
FROM tf.traffic 
WHERE (date = '2017-01-29') AND (date_time = '2017-01-29 08:59:59')
LIMIT 10

┌───────────date_time─┐
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
└─────────────────────┘
┌───────────date_time─┐
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
└─────────────────────┘

10 rows in set. Elapsed: 0.178 sec. Processed 1.84 million rows, 11.01 MB (10.31 million rows/s., 61.88 MB/s.) 



И вот еще:

SELECT date_time
FROM tf.traffic 
WHERE date_time = '2017-01-29 08:59:59'
LIMIT 10

┌───────────date_time─┐
│ 2017-01-29 03:59:59 │
│ 2017-01-29 03:59:59 │
└─────────────────────┘
┌───────────date_time─┐
│ 2017-01-29 03:59:59 │
│ 2017-01-29 03:59:59 │
└─────────────────────┘
┌───────────date_time─┐
│ 2017-01-29 03:59:59 │
└─────────────────────┘
┌───────────date_time─┐
│ 2017-01-29 03:59:59 │
└─────────────────────┘
┌───────────date_time─┐
│ 2017-01-29 03:59:59 │
│ 2017-01-29 03:59:59 │
│ 2017-01-29 03:59:59 │
│ 2017-01-29 03:59:59 │
└─────────────────────┘

10 rows in set. Elapsed: 1.376 sec. Processed 7.15 billion rows, 28.58 GB (5.19 billion rows/s., 20.77 GB/s.) 



Я понимаю что поле date не сохраняет данные о зоне и содержит данные на момент сохранения - в моем случае EST. Понимаю что поле date_time приводится к UTC из EST и сохраняется. А когда я использую clickhouse-client то для отображения используется локальная таймзона, где он был запущен. Но я не могу понять как выбираются эти строки, таке ощущени что все скачет +/- 5 часов, но какая логика?

Я пробовал использовать функцию toDateTime для приведения к этому типу, но ничего не изменилось:

SELECT date_time
FROM tf.traffic 
WHERE date_time = toDateTime('2017-01-29 13:59:59')
LIMIT 10

┌───────────date_time─┐
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
│ 2017-01-29 08:59:59 │
└─────────────────────┘

10 rows in set. Elapsed: 1.187 sec. Processed 6.08 billion rows, 24.34 GB (5.12 billion rows/s., 20.50 GB/s.) 



Помогите разобраться. Как же всетаки получить то что написано в WHERE?
Заранее спасибо.



ЗЫ: версия кликхауза

ClickHouse client version 1.1.54023.
Connecting to localhost:9000.
Connected to ClickHouse server version 1.1.54023.





Pavel Artemkin

unread,
Feb 7, 2017, 7:31:37 AM2/7/17
to ClickHouse
Вы можете управлять тем, что выводит клиент слеудющим образом:

1. Задать текщую таймзону для процесса:
TZ=UTC clickhouse-client --use_client_time_zone=1 --query="SELECT date_time...."

2. В интерактивном режиме выполнить команду:
SET use_client_time_zone=1;
чтобы использовалась таймзона клиента.


пятница, 3 февраля 2017 г., 17:36:44 UTC+5 пользователь Maxim Savenko написал:

Maxim Savenko

unread,
Feb 7, 2017, 7:48:12 AM2/7/17
to ClickHouse
Добрый день, Павел!

Попробовал, и получил следующий вывод:


:) SET use_client_time_zone=1;

SET use_client_time_zone = 1

Received exception from server:
Code: 115. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Unknown setting use_client_time_zone.

0 rows in set. Elapsed: 0.058 sec.



Я развернул последнюю версию Clickhouse (1.1.54140)  и обнаружил настройку timezone в config.xml сервера. В нашей версии, такой настройки не было. Комментарий к настройке:

        <!-- Server time zone could be set here.

             Time zone is used when converting between String and DateTime types,
                  when printing DateTime in text formats and parsing DateTime from text,
                  it is used in date and time related functions, if specific time zone was not passed as an argument.

                 Time zone is specified as identifier from IANA time zone database, like UTC or Africa/Abidjan.
                 If not specified, system time zone at server startup is used.
        -->
        <!-- <timezone>Europe/Moscow</timezone> -->


Может доработали? Будем пробовать обновлять нашу версию. 


Спасибо за ваш ответ.


вторник, 7 февраля 2017 г., 15:31:37 UTC+3 пользователь Pavel Artemkin написал:

Pavel Artemkin

unread,
Feb 7, 2017, 7:50:07 AM2/7/17
to ClickHouse
Да, эта опция появилась недавно.


вторник, 7 февраля 2017 г., 17:48:12 UTC+5 пользователь Maxim Savenko написал:
Reply all
Reply to author
Forward
0 new messages