@clickhouse_ru

Страница 23 из 723
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
и можно пример кода, он нам понадобитсья?
у нас используется примерно в таком виде http://pastebin.com/MerLev0h

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;

CAST ещё не описали.
где лучше, в "Функции преобразования типов"?

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
https://github.com/smi2/clickhouse-frontend
Выглядит офигенно

Anatoly
29.11.2016
11:34:05
https://github.com/smi2/clickhouse-frontend
спасибо большое.

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 кстати )

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

Valeriy
29.11.2016
15:39:17
http://guiclickhouse.smi2.ru Хостед решение
Не работает вставка средней кнопкой мыши в окно запроса в Linux (

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

Страница 23 из 723