

Vladislav
28.11.2016
14:02:26
Коллеги, всем привет. Мы с Романам Архаровым хотим использовать КХ на нашем проекте. У меня вопрос по внешним словарям. А могут ли быть ими таблицы с историчность.
Поясню. Например у нас есть справочник вендоров-поставщиков, где по каждому id есть название, url и ссылка на картинку picture. В процессе жизни приложение, допустим, название или другие поля, например, могу меняться. Чтобы поддерживать историчность мы хотим сделать для каждого id пару столбцов actual_date_time и actual_end_date_time, определяющих, что такие-то поля были актуальны во временном промежутке от [actual_date_time, actual_end_date_time]. Понятно, если текущие поля актульны до сих пор, то можно поставить actual_end_date_time равным 2100 году, например.
В КХ есть ли какая-то функция, которая возвращает поле не только по id, по и учитывая даты актульности, то есть date between actual_date_time and actual_end_date_time например
используйте лучше SCD2, для колоночных это приемлемее, вот только я несмотрел документацию, как обстоят дела с аналитическими функциями, чтобы вытягивать актуальность и историю


Alexander
28.11.2016
14:09:20
а что за SCD2? в доке про кликхаусу этого тоже нет

papa
28.11.2016
14:09:51

Igor
28.11.2016
14:11:54
правильно ли будет назвать CASE WHEN THEN ELSE "условным выражением" в документации?

Google

Darafei
28.11.2016
14:13:09
https://postgrespro.ru/docs/postgrespro/9.6/functions-conditional

Alexander
28.11.2016
14:14:22
отлично, да, то что нам нужно, большое спасибо

Igor
28.11.2016
14:15:10
вот да, русская дока по постгресу как раз послужила вдохновением. спасибо

Vladislav
28.11.2016
14:19:22
по одному полю


Alexey
28.11.2016
14:31:32
Документация по range_hashed:
В таблице прописаны какие-то данные для диапазонов дат, для каждого ключа. Дать возможность доставать эти данные для заданного ключа, для заданной даты.
Пример: в таблице записаны скидки для каждого рекламодателя в виде:
id рекламодателя дата начала действия скидки дата конца велечина
123 2015-01-01 2015-01-15 0.15
123 2015-01-16 2015-01-31 0.25
456 2015-01-01 2015-01-15 0.05
Добавляем layout = range_hashed.
При использовании такого layout, в structure должны быть элементы range_min, range_max.
Пример:
<structure>
<id>
<name>Id</name>
</id>
<range_min>
<name>first</name>
</range_min>
<range_max>
<name>last</name>
</range_max>
...
Эти столбцы должны иметь тип Date. Другие типы пока не поддерживаем.
Столбцы обозначают закрытый диапазон дат.
Для работы с такими словарями, функции dictGetT должны принимать ещё один аргумент - дату:
dictGetT('dict_name', 'attr_name', id, date)
Функция достаёт значение для данного id и для диапазона дат, в который входит переданная дата. Если не найден id или для найденного id не найден диапазон, то возвращается значение по-умолчанию для словаря.
Если есть перекрывающиеся диапазоны, то можно использовать любой подходящий.
Если граница диапазона является NULL или является некорректной датой (1900-01-01, 2039-01-01), то диапазон следует считать открытым. Диапазон может быть открытым с обеих сторон.
В оперативке данные представлены в виде хэш-таблицы со значением в виде упорядоченного массива диапазонов и соответствующих им значений.
Пример словаря по диапазонам:
<dictionaries>
<dictionary>
<name>xxx</name>
<source>
<mysql>
<password>xxx</password>
<port>3306</port>
<user>xxx</user>
<replica>
<host>xxx</host>
<priority>1</priority>
</replica>
<db>dicts</db>
<table>xxx</table>
</mysql>
</source>
<lifetime>
<min>300</min>
<max>360</max>
</lifetime>
<layout>
<range_hashed />
</layout>
<structure>
<id>
<name>Abcdef</name>
</id>
<range_min>
<name>StartDate</name>
</range_min>
<range_max>
<name>EndDate</name>
</range_max>
<attribute>
<name>XXXType</name>
<type>String</type>
<null_value />
</attribute>
</structure>
</dictionary>
</dictionaries>
Но если нужно хранить значения на момент вставки, то имеет смысл сохранять их прямо в таблицу фактов и не использовать словари.


Aleksandr
28.11.2016
14:37:14
#doc (тег, чтобы потом найти сообщение с документацией)

Alexey
28.11.2016
14:37:55
Скопируйте в официальную документацию, если у кого есть минут 20 на это.

Igor
28.11.2016
14:38:07
ок, куда ее? как раз сейчас правлю

Alexey
28.11.2016
14:38:20
Во "внешние словари".

Igor
28.11.2016
14:38:35
хорошо, спасибо. ничего, если без английской пока?

Alexey
28.11.2016
14:38:41
Пока ничего.

Google

papa
28.11.2016
14:47:48
с DateTime работать будет?

Alexey
28.11.2016
14:48:16
Судя по документации, которую я отправил - нет.

Alexander
28.11.2016
14:50:26
всем спасибо большое
очень помогло

Igor
28.11.2016
14:51:51
https://github.com/yandex/ClickHouse/pull/206

Alexey
28.11.2016
14:54:35
Помержил. Но есть ещё пара уточнений...

Igor
28.11.2016
14:54:57
Давайте)

Alexey
28.11.2016
14:55:39
У CASE есть два варианта, так же как здесь:
http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case
(один по условиям, который вы описали, другой - по значениям)
Тот, который по значениям, раскрывается в функцию transform.

Igor
28.11.2016
14:56:36
спасибо, допишу!
навскидку - есть еще что-нибудь из частоиспользуемого в других SQL-диалектах, чего нет в документации?

Alexey
28.11.2016
14:57:05
CAST ещё не описали.

Darafei
28.11.2016
14:57:28
а что в ANSI SQL про такой CASE?

Alexey
28.11.2016
14:57:56
Не припоминаю.

Igor
28.11.2016
14:58:11
http://docs.faircom.com/doc/sqlref/33399.htm
о, а раз есть transform(x, array_from, array_to) без аргумента default, может имеет смысл сделать необязательным в таком случае ELSE в аналогичном выражении CASE?

Alexey
28.11.2016
15:13:59
Не уверен. Может быть не стоит, чтобы не запоминать смысл такого случая.

Igor
28.11.2016
15:15:15
Да, наверное, я поспешил - и типы конвертировать придется, например, в таком случае
:) SELECT 2 AS x, transform(x, [1, 2], ['one', 'two']) AS xx;

Alexey
28.11.2016
15:31:27
Да.

Alexander
28.11.2016
16:01:12
столбцы "дата начала действия скидки" и "дата конца" во внешнем словаре как-то должна стандартным образом называться

Google

Alexander
28.11.2016
16:01:14
или не важно?
а это в xml задается
<range_min>
<name>first</name>
</range_min>
<range_max>
<name>last</name>
</range_max>
правильно?
все вопрос снимается

Igor
28.11.2016
16:02:18
угу, там еще пример есть
<range_min>
<name>StartDate</name>
</range_min>

Alexander
28.11.2016
16:04:38
сорри, увидел, спасибо большое
только в доке по-моему опечатка, велечина
а надо "величина"

Igor
28.11.2016
16:08:59
ща
добавил исправление в #207

Виктор
28.11.2016
17:25:57
У меня аж слеза наворачивается
Вместе допиливаем доку
Коммьюнити, опенсорс!

Igor
28.11.2016
17:27:48
я просто в с++ не умею. иначе писал бы код, как все нормальные программисты, а не доку! %)
а это нормально, что SELECT sleep(1) отрабатывает за ~3.012 сек?
в документации написано, что "спит N секунд на каждый блок данных". получается, простой SELECT 1 запрашивает три блока данных?

Виктор
29.11.2016
09:35:34
Да :)
Обсуждали внутри когда-то, получается 3 блока данных по каким-то причинам

Evgeny
29.11.2016
11:23:20
А можно как-нибдуь грохнуть запрос по его id? С виду безобидный select * from events order by ts desc limit 10 висит уже больше часа, а процессед у него всего 8млрд из 23

Igor
29.11.2016
11:24:10
да

Google

Igor
29.11.2016
11:24:38
127.0.0.1:8123/?replace_running_query=1&query_id=айди_запроса&query=SELECT+1

Evgeny
29.11.2016
11:25:30
а из консольного клиента никак не получится? Но это тоже рабочий вариант, спасибо.

Igor
29.11.2016
11:25:59
из консольного - хз
можно поставить питоний clickhouse-cli, он кривой до жути, но там есть \kill и он все равно работает по http %)

Evgeny
29.11.2016
11:29:20
За clickhouse-cli спасибо, не встречал его до этого

Igor
29.11.2016
11:30:14
я его старался не светить, он правда кривой еще

Anatoly
29.11.2016
11:31:06
а мне говорили коллеги, что есть веб-гуи для кликхауса. ссылочку не подкинете?

Igor
29.11.2016
11:31:19
https://github.com/smi2/clickhouse-frontend

Vladimir
29.11.2016
11:33:49

Anatoly
29.11.2016
11:34:05

Igor
29.11.2016
11:35:20
не за что, ссылка на веб-морду в документации есть :)
и в чате чуваки из smi2 тоже есть :)

Anatoly
29.11.2016
11:35:48

Evgeny
29.11.2016
11:36:49
Вебморду, кстати, можно прямо из браузера использовать на своём кликхаусе

Igor
29.11.2016
11:37:20
http://guiclickhouse.smi2.ru
Хостед решение
Т/е можно к себе не разворачивать)

Anatoly
29.11.2016
11:38:38
не, нельзя. по другим причинам.
Но спасибо, я видел :)

Виктор
29.11.2016
11:38:46
Метрика не стоит, плохо!

Igor
29.11.2016
11:46:54
Очень хочу поставить - метрику чтобы понимать сколько людей пользуется;) но боюсь тогда - посыпятся вы за нами следите )))

Виктор
29.11.2016
11:48:05
У вас серверные логи в любом случае есть, так что это странный аргумент

Google

Igor
29.11.2016
11:48:16
почему есть?

Igor
29.11.2016
11:48:30
А мы на github.pages хостим)

Igor
29.11.2016
11:48:49
а, я подумал, серверные логи == включая запросы, уходящие на КХ-сервер )

Виктор
29.11.2016
11:48:56
Ну, это не очевидно совсем =)

ptchol
29.11.2016
12:32:27
В редаше кто то запилил поддержк clickhouse кстати )

Igor
29.11.2016
12:45:39

ptchol
29.11.2016
12:50:35
Аха, мы тоже с редашем уже где то месяцев 8 живем. Брат жив )

Valeriy
29.11.2016
15:39:17

Igor
29.11.2016
15:39:53
мож браузер виноват?

Valeriy
29.11.2016
15:40:16
Хм. Может.
Да, в FF не работает, в Chrome работает. Спасибо.

Vladimir
29.11.2016
17:31:01
А кто нибудь пробовал использовать уже кликхаус под графит? У меня что то не получается с retention'ами.
Вставить-почитать отлично, но точки не огрубляются
https://gist.github.com/anonymous/f57d86fba24bcaf917f936281b3120db

Dmitry
29.11.2016
17:50:06
а попробуй дернуть OPTIMIZE FINAL