@clickhouse_ru

Страница 203 из 723
Vladimir
14.07.2017
07:28:36
arrayUniq(arr, ...) вроде кол-во уникальных возвращает, а мне они сами нужны

Дмитрий
14.07.2017
07:28:52
arrayReduce

я саму функцию не нашел в документации, но по описанию похоже на ваш случай

Vladimir
14.07.2017
07:29:51
сча попробую

Google
Vladimir
14.07.2017
07:31:14
а вы не знаете что 2 аргументом передавать?

SELECT DISTINCT arrayReduce(tags.name) FROM Measures WHERE (account = 'xyz') AND (tags.value[indexOf(tags.name, 's:i')] = '4291') Received exception from server: Code: 42. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Number of arguments for function arrayReduce doesn't match: passed 1, should be at least 2.. 0 rows in set. Elapsed: 0.236 sec.

Дмитрий
14.07.2017
07:31:50
Написано что использовать вот так: arrayReduce('groupUniqArray', arr)

Vladimir
14.07.2017
07:32:08
пробую

Alex
14.07.2017
07:35:31
Есть таблица, одна колонка это массив строк, как бы это distinct по значениям с массиве построить? что-то не придумывается
Попробуйте функцию groupUniqArray с комбинатором -Array: https://clickhouse.yandex/docs/ru/agg_functions/index.html#array

Vladimir
14.07.2017
07:36:47
Написано что использовать вот так: arrayReduce('groupUniqArray', arr)
эта функция не раскрывает массив, она уникальные в нем ищет, а внутри каждого массива у меня и так уникальные значение distinct(arrayJoin(arr)) как советовали выше это то что надо мне

спсб

Vsevolod
14.07.2017
07:38:01
я бы все-таки сбоку хранил хеши

все эти джоины - это черная магия, которая может сожрать непредсказуемое количество памяти...

Vladimir
14.07.2017
07:38:39
хеши от строк в отдельном массиве?

Vsevolod
14.07.2017
07:38:47
в отдельной колонке

и не от строк, а от всего массива строк

Google
Vladimir
14.07.2017
07:39:07
так

и как потом?

Vsevolod
14.07.2017
07:39:13
('a', 'b', 'c') -> hash('abc')

Alex
14.07.2017
07:39:28
:) select a from t SELECT a FROM t ┌─a─────────┐ │ ['a','b'] │ │ ['c','a'] │ └────────────┘ 2 rows in set. Elapsed: 0.001 sec. :) select groupUniqArrayArray(a) from t SELECT groupUniqArrayArray(a) FROM t ┌─groupUniqArrayArray(a)─┐ │ ['c','a','b'] │ └─────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec. :)

Vsevolod
14.07.2017
07:39:37
а потом искать distinct хеши, очевидно

Vladimir
14.07.2017
07:39:45
так

мне не надо уникальные массивы

мне надо все уникальные элементы в массивах

я туплю? дайте подумать...

Ilya
14.07.2017
07:41:08
Чуь выше тоже вариант, но результат в массиве а не отдельные значения

С groupuniquearrayarray

Vladimir
14.07.2017
07:42:28
groupuniquearrayarray сча попробую вроде подходит а с хешами не догнал как оно мне что то я хочу даст Всеволод не могли бы вы пояснить?

groupUniqArrayArray сработало, по производительности такое же как distinct(arrayJoin)

Vsevolod
14.07.2017
07:51:59
боюсь, что я не так понял вашу задачу

Vladimir
14.07.2017
07:52:24
спасибо за пояснение

Vsevolod
14.07.2017
07:52:49
с хешами не получится решение - только с временной таблицей, где бы эти строки были бы распакованы из массивов

Vladimir
14.07.2017
07:53:15
arrrayJoin оно и есть как мне кажется

Vsevolod
14.07.2017
07:53:54
да, но в таблице можно сделать индекс, и это все будет очень быстро

Vladimir
14.07.2017
07:54:34
а обновляться она будет автоматом? ну при вставке в невременную

Google
Vsevolod
14.07.2017
07:55:17
у меня в Rspamd была похожая задача - сосчитать в массивах самые популярные элементы

делал через arrayjoin

но скорость была неприятна

Vladimir
14.07.2017
07:58:32
согласен, надо прочитать про временные таблицы, у меня идет постоянная вставка и не хотелось бы перестраивать эту таблицу каждые 30 сек, это накладно по видимому. а вот если оно инкрементально само апдейтится спасибо за наводку, ушел читать

Aleksandr
14.07.2017
08:11:12
Не очень понятна разница между "все данные по десятой части user_id" и "часть данных по 10% user_id"
Допустим у меня есть два пользователя, user_id 1 с 10 просмотрами страниц и user_id 2 со 100 просмотрами страниц. Все данные по 10% user_id значит что в выборку попадут либо 10 просмотров от первого user_id, либо 100 просмотров второго user_id. Часть данных по 10% user_id значит, что я выберу 10% данных. То есть я получу 11 просмотров от второго или 10 просмотров первого.

Собственно первый вариант это аналог запроса: global in ( SELECT user_id FROM table SAMPLE 0.1 WHERE dt …) То есть я выбираю 10% user_id и делаю join. Я уверен, что все данные от выбранных мной user_id приедут для обработки.

Vladimir
14.07.2017
08:17:00
я так понимаю что если ваш sample key это userId то 10% от каждого попадет в итог (10 от одного и 1 от другого) для этого sample key и предназначен

Alex
14.07.2017
08:22:16
Допустим у меня есть два пользователя, user_id 1 с 10 просмотрами страниц и user_id 2 со 100 просмотрами страниц. Все данные по 10% user_id значит что в выборку попадут либо 10 просмотров от первого user_id, либо 100 просмотров второго user_id. Часть данных по 10% user_id значит, что я выберу 10% данных. То есть я получу 11 просмотров от второго или 10 просмотров первого.
Тогда первое. При семплировании 0.1 возможная область значений ключа сэмплирования делится на 10 частей и в запрос добавляется соответствующий фильтр. То есть, если юзера два, может и пустой ответ придти :) Но в общем случае запрос отработает над всеми данными для десятой части юзеров.

(тут мы полагаемся на то, что хэш равномерно распределит значения)

Vladimir
14.07.2017
08:24:02
1/10 пользователей или 1/10 данных каждого пользователя?

Alex
14.07.2017
08:26:07
1/10 пользователей, если ключ сэмплирования intHash32(UserID)

Vladimir
14.07.2017
08:29:45
спсб думал по другому

Vladimir
14.07.2017
08:46:10
Всем привет. Подскажите ответы на пару вопросов: 1. Как поведёт себя CH при закончившемся месте на диске? При вставке и при merge. 2. Какой самый правильный способ ограничить потребление места на диске clickhouse'ом, когда места осталось чуть-чуть?

Vladimir
14.07.2017
08:47:47
Всем привет. Подскажите ответы на пару вопросов: 1. Как поведёт себя CH при закончившемся месте на диске? При вставке и при merge. 2. Какой самый правильный способ ограничить потребление места на диске clickhouse'ом, когда места осталось чуть-чуть?
1. В логи (если под них место не кончилось) будет писать что-то в духе 2017.06.30 10:54:45.668955 [ 1309 ] <Error> executeQuery: Code: 75, e.displayText() = DB::Exception: Cannot write to file /var/lib/clickhouse//data/default/metricstats/default@10%2E198%2E230%2E12:9000/tmp/172692.bin, errno: 28, strerror: No space left on device, e.what(

и вроде как вставки на этот сервер работать не будут (будет такой эксепшн на инсерты)

Vladimir
14.07.2017
08:48:48
Будет возвращать клиентам эти ошибки и не будет при этом падать, да? Звучит хорошо.

Vladimir
14.07.2017
08:50:23
Будет возвращать клиентам эти ошибки и не будет при этом падать, да? Звучит хорошо.
да, чтение вроде работало нормально когда у меня место кончилось

Vladimir
14.07.2017
08:50:55
Ок, спасибо. На первый взгляд выглядит как то, что надо. Проверим ещё на всякий случай.

Andrey
14.07.2017
09:57:29
Место ведь может закончится в процессе мёржа и без клиентских соединений?

Google
Vsevolod
14.07.2017
10:24:36
что-то непонятно мне с drop partition: хочется грохнуть данные за заданный день, а не месяц

и в system.parts видны нужные куски

а фиг там - удаляй за месяц или GTFO

нет, простое решение-то понятно

Vladimir
14.07.2017
10:27:11
@cebka партиционирование пока только помесячное, они обещают сделать произвольное

Admin
ERROR: S client not available

Vsevolod
14.07.2017
10:27:16
называть таблицу в виде tbl-yymmdd

но это адски тупо

так еще одно: join по ключам, которые слева и справа имеют разное имя

все, приехали?

нет, можно опять же сделать subquery, но это такая же боль...

и вдогонку select * from t1 any left join (select *,kt2 as kt1 from t2) using kt1; показывает все поля t1

но поля t2 остаются где-то в стороне

при этом, если попросить выдать select ft2 from ..., (указав явно поле из t2), то оно магическим образом всплывает

f1yegor
14.07.2017
10:56:18
Это известное поведение, экспортятся столбцы из левой таблицы

Vsevolod
14.07.2017
10:56:40
ну это полная жопа же

какой тогда вообще смысл в таком джоине?

f1yegor
14.07.2017
10:56:55
Из правой - только явно объявленные

Vsevolod
14.07.2017
10:57:11
нет, ну я могу это обойти, конечно

просто тут попробовал в лоб select * from t1,t2 where kt1 == kt2; так что бы вы думали: unknown combination of JOIN

Google
Vsevolod
14.07.2017
10:57:52
(кажется, я уже когда-то такое видел)

эти ограничения очень странные и неприятные

f1yegor
14.07.2017
11:00:01
Пока так, под конец года это планируется изменить

Vsevolod
14.07.2017
11:11:21
ну, видимо, я буду по работе много работать с кликхаусом - похоже, мне удалось убедить использовать его вместо kdb

вопрос в том, насколько охотно принимаются патчи

или нам работать со своим форком

Andrey
14.07.2017
11:20:55
Патчи очень охотно принимаются, по крайней мере пока.

Vsevolod
14.07.2017
11:22:16
ну, пока мне не было дано разрешение над работой над кликхаусом в рабочее время. а в поездах я работаю над Rspamd :) Но в выходные я постараюсь что-нибудь родить

тогда и посмотрим

papa
14.07.2017
12:09:12
какой тогда вообще смысл в таком джоине?
джойн работает нормально, контринтуитивно работает звездочка. говорят, это временное явление.

Vsevolod
14.07.2017
12:17:48
Мне хочется джойна по полям с разным именем

papa
14.07.2017
12:18:52
а мне хочется чтобы count() пустоты был равен нулю.

давайте напишем Леше письмо, и он обязательно нам поможет.

Tima
14.07.2017
12:19:54
Мне хочется джойна по полям с разным именем
https://clickhouse.yandex/docs/ru/development/style.html Ну или подзапросы, в который поля переименовываются

Vsevolod
14.07.2017
13:37:41
ничего не понимаю: toUnixTimestamp(today()) возвращает unix timestamp из 70-х годов 20-го века

это норма?

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