Size: a a a

ClickHouse не тормозит

2021 February 23

FN

Fred Navruzov in ClickHouse не тормозит
спасибо, сейчас гляну
а вдруг что - можно это на лету поправить, или нужно пересоздавать таблицу?
источник

S

Slach in ClickHouse не тормозит
ну вы гляньте сначала
а потом из массива достать можно типа time_local_tz[0]
источник

FN

Fred Navruzov in ClickHouse не тормозит
да, так и есть, таймзоны - массив, сейчас подкорректирую
класс, спасибо, сам бы я как новичок в КХ долго разбирался
источник

FN

Fred Navruzov in ClickHouse не тормозит
Slach
toTypeName(time_local_str), toTypeName(time_local_tz)
посмотрите
теперь оба типа возвращают string,  но появляется новая ошибка (требует константу в первій аргумент, наверное)
 Code: 44, e.displayText() = DB::Exception: Argument at index 1 for function parseDateTimeBestEffort must be constant: while executing 'FUNCTION parseDateTimeBestEffort(toString(dt) : 3, tz_id : 2) -> parseDateTimeBestEffort(toString(dt), tz_id) DateTime : 6' (version 21.1.2.15 (official build))
источник

FN

Fred Navruzov in ClickHouse не тормозит
Fred Navruzov
теперь оба типа возвращают string,  но появляется новая ошибка (требует константу в первій аргумент, наверное)
 Code: 44, e.displayText() = DB::Exception: Argument at index 1 for function parseDateTimeBestEffort must be constant: while executing 'FUNCTION parseDateTimeBestEffort(toString(dt) : 3, tz_id : 2) -> parseDateTimeBestEffort(toString(dt), tz_id) DateTime : 6' (version 21.1.2.15 (official build))
или это я уже туплю, и там нельзя функции накидывать, только сырую колонку подавать?
p.s. изменил на сырую колонку, безо всяких функций поверх, первым аргументом подал, но та же ошибка
Code: 44, e.displayText() = DB::Exception: Argument at index 1 for function parseDateTimeBestEffort must be constant: while executing 'FUNCTION parseDateTimeBestEffort(dt_str : 2, tz_id : 3) -> parseDateTimeBestEffort(dt_str, tz_id) DateTime : 6' (version 21.1.2.15 (official build))
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Fred Navruzov
Господа, уточните, так ли работает?
если на основе таблицы делается агрегатный materialized view через populate, то вью будет содержать все данные таблицы, но автоматически обновит свои данные ТОЛЬКО при инсерте новых данных в изначальную таблицу? т.е. если в изначальной таблице поменяются старые данные (вдруг), то вью этого не отобразит?

и второй вопрос - (я предполагаю, что можно) можно ли на основе mat.view делать еще 1 mat.view, таким образом навешивая несколько последовательных триггеров на инсерт данных в изначальную таблицу - все они будут обновляться при вставке в изначальную?
источник

FN

Fred Navruzov in ClickHouse не тормозит
👍
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Fred Navruzov
или это я уже туплю, и там нельзя функции накидывать, только сырую колонку подавать?
p.s. изменил на сырую колонку, безо всяких функций поверх, первым аргументом подал, но та же ошибка
Code: 44, e.displayText() = DB::Exception: Argument at index 1 for function parseDateTimeBestEffort must be constant: while executing 'FUNCTION parseDateTimeBestEffort(dt_str : 2, tz_id : 3) -> parseDateTimeBestEffort(dt_str, tz_id) DateTime : 6' (version 21.1.2.15 (official build))
TZ только константа
источник

FN

Fred Navruzov in ClickHouse не тормозит
а не подскажете, нет ли какой-то векторизированной функции, которая принимает колонку со строками (или datetime-ми) + колонку с таймзонами (строки) ?
или как ее имитировать друими способами
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Yuriy Yurkiv
Добрый день. Подскажите пожалуйста:
есть таблица
user_id, ... , paid, session_id, date, ...
нужно вычислить количество бесплатных сессий до самой первой оплаты для каждого пользователя
groupArray получаем массив, обрезаем arraySlice массив по paid, находим длину массива
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Fred Navruzov
а не подскажете, нет ли какой-то векторизированной функции, которая принимает колонку со строками (или datetime-ми) + колонку с таймзонами (строки) ?
или как ее имитировать друими способами
что за проблему то решаем? откуда в БД имена таймзон?
источник

FN

Fred Navruzov in ClickHouse не тормозит
Fred Navruzov
ребята, помогите пожалуйста, вопрос по таймзонам и временнОй фильтрации
есть таблица, в ней есть колонка time_local - String с локальным временем (локальная для указанной таймзоны, пример "2021-02-19 18:00:00" - 6 часов по Киеву) и колонка time_local_tz - String с с таймзонами (пример "Europe/Kiev" )

конечная цель - отфильтровать запросом "исторические данные" = взять все данные за прошедший час и ранее = для которых локальное время < toStartOfHour( now(time_local_tz) )
т.е. если сейчас в киеве 13:50 локальное время, то должны по киеву в запрос попасть строки включительно по "2021-02-23 13:00:00" в колонке time_local. Аналогично для каждой строки со своей таймзоной

но я так понимаю, что векторизированно колонку time_local_tz в now() не передать, now(time_local_tz) не прокатит,  только скаляры)? как мне для каждой строки вычислить правильный now_local() ?
возможно есть более простые/быстрые/правильные способы, как достичь конечной цели
@den_crane - вот такой вопрос изначальный
имена таймзон - так сложилось исторически :)  в дейттайм колонку записалось локальное время, но как datetime('utc'), а не как datetime(local_timezone), и отдельно есть колонка timezone (string)
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Fred Navruzov
@den_crane - вот такой вопрос изначальный
имена таймзон - так сложилось исторически :)  в дейттайм колонку записалось локальное время, но как datetime('utc'), а не как datetime(local_timezone), и отдельно есть колонка timezone (string)
это все до КХ надо делать, хранить и локальное тоже, в отдельной колонке

в КХ заводите таблицу словарь, который в секундах заполнен offset для Europe/Kiev и для периодов
прибавляете
источник

FN

Fred Navruzov in ClickHouse не тормозит
Denny Crane [not a Yandex bot]
это все до КХ надо делать, хранить и локальное тоже, в отдельной колонке

в КХ заводите таблицу словарь, который в секундах заполнен offset для Europe/Kiev и для периодов
прибавляете
спасибо, я уже склонялся к подобному решению, что без таблицы-словаря не обойтись, но я так понимаю что простые оффсеты в секундах (при условии 1 записи на таймзону) будут ломаться для  daylight saving time, если есть перевод часов?
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Fred Navruzov
спасибо, я уже склонялся к подобному решению, что без таблицы-словаря не обойтись, но я так понимаю что простые оффсеты в секундах (при условии 1 записи на таймзону) будут ломаться для  daylight saving time, если есть перевод часов?
Europe/Kiev и для периодов
rangeHashed , для каждого промежутка, надо сделать запись  от до
rangeHashed умеет только числа ключом, поэтому еще через один словарь придется перекодировать Europe/Kiev в число
источник

FN

Fred Navruzov in ClickHouse не тормозит
жестко )
попробуем, если нет другого варианта, получается
источник

KS

Konstantin Sevastian... in ClickHouse не тормозит
Fred Navruzov
ребята, помогите пожалуйста, вопрос по таймзонам и временнОй фильтрации
есть таблица, в ней есть колонка time_local - String с локальным временем (локальная для указанной таймзоны, пример "2021-02-19 18:00:00" - 6 часов по Киеву) и колонка time_local_tz - String с с таймзонами (пример "Europe/Kiev" )

конечная цель - отфильтровать запросом "исторические данные" = взять все данные за прошедший час и ранее = для которых локальное время < toStartOfHour( now(time_local_tz) )
т.е. если сейчас в киеве 13:50 локальное время, то должны по киеву в запрос попасть строки включительно по "2021-02-23 13:00:00" в колонке time_local. Аналогично для каждой строки со своей таймзоной

но я так понимаю, что векторизированно колонку time_local_tz в now() не передать, now(time_local_tz) не прокатит,  только скаляры)? как мне для каждой строки вычислить правильный now_local() ?
возможно есть более простые/быстрые/правильные способы, как достичь конечной цели
я мб что то упустил, из этого вам ничего не поможет?
SELECT
   now(),
   'Asia/Yekaterinburg' AS tz,
   toTimeZone(now(), 'Europe/Moscow'),
   toTimeZone(now(), tz)

Query id: 3967b8d8-9b58-4a11-9a5e-4be9be5e2e56

Row 1:
──────
now():                                   2021-02-23 13:28:03
tz:                                      Asia/Yekaterinburg
toTimeZone(now(), 'Europe/Moscow'):      2021-02-23 16:28:03
toTimeZone(now(), 'Asia/Yekaterinburg'): 2021-02-23 18:28:03
источник

FN

Fred Navruzov in ClickHouse не тормозит
Konstantin Sevastianov
я мб что то упустил, из этого вам ничего не поможет?
SELECT
   now(),
   'Asia/Yekaterinburg' AS tz,
   toTimeZone(now(), 'Europe/Moscow'),
   toTimeZone(now(), tz)

Query id: 3967b8d8-9b58-4a11-9a5e-4be9be5e2e56

Row 1:
──────
now():                                   2021-02-23 13:28:03
tz:                                      Asia/Yekaterinburg
toTimeZone(now(), 'Europe/Moscow'):      2021-02-23 16:28:03
toTimeZone(now(), 'Asia/Yekaterinburg'): 2021-02-23 18:28:03
по отдельности работает, я такое проверял, а на колоночных аргументах (векторизированно) не работает
т.е. нельзя сделать to_TimeZone(now(), колонка_с_таймзонами) - не работает  ,  to_TimeZone(now(), конкретная_таймзона)  - работает
в этом моя проблема была в том вопросе
источник

FN

Fred Navruzov in ClickHouse не тормозит
попытаю счастья еще раз (когда вариант изменить типы / флоу загрузки / предварительную обработку и т.д. не представляется возможным) 😄 :
есть таблица, в ней есть
-  колонка с локальным временем (string), пример "2021-02-23 16:00:00" (по Киеву), "2021-02-23 16:00:00" (по Москве),
-  колонка с локальной таймзоной (string), пример "Europe/Kiev", "Europe/Moscow" (значения для каждой строки - своё собственное)

как имея эти колонки, перейти к колонке  utc_timestamp в которой будут интовые значения времени?
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
Fred Navruzov
попытаю счастья еще раз (когда вариант изменить типы / флоу загрузки / предварительную обработку и т.д. не представляется возможным) 😄 :
есть таблица, в ней есть
-  колонка с локальным временем (string), пример "2021-02-23 16:00:00" (по Киеву), "2021-02-23 16:00:00" (по Москве),
-  колонка с локальной таймзоной (string), пример "Europe/Kiev", "Europe/Moscow" (значения для каждой строки - своё собственное)

как имея эти колонки, перейти к колонке  utc_timestamp в которой будут интовые значения времени?
а сколько строк?
источник