- 01 September 2017 (96 messages)
-
А как правильнее (ID) или (Date,ID) ?
-
Или по Dete по любому есть индекс?
-
-
-
-
Konstantin Надо сдлеать:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4
а потом ставить кликхаус -
вроде бы так и делаю
-
-
Вопрос по джоинам, я так понял что это не самая сильная сторона кликхауса и лучше дублировать данные чем делать джоины в больших таблицах?
-
а ключ кто будет прописывать?
-
-
какой именно ключ? разве E056BD4 не ключ? =/
-
ключ не прописался, вывод немного намекает на это
-
убрал пробел - лучше не стало =(
-
-
это я вроде понял, я не знаю как это вылечить
-
-
ключ не верный, внимательнее
-
Семь символов. В ключе восемь.
-
-
-
-
подскажите, пожалуйста, с чем может быть связана ошибка:
Received exception from server:
Code: 194. DB::Exception: Received from host1, IP. DB::Exception: Received from host2, IP. DB::Exception: Password required for user default.
Появилась после апдейта CH, таблицы реплицируемые, выполняется альтер. На одной реплике отрабатывает, на другой всегда ругается, что нет пароля. -
Материлизованное представление наполняется тригеррами. Например есть у вас запрос типа select count() as result, date from table group by date. При вставке данных в таблицу table сработает триггер и на сколько я помню запрос будет применен на поступивший блок данных и результат запроса будет записан в материализованное представление.
-
-
Приветствую. Хочу понять, будет ли работать придуманная конфигурация.
Условия задачи:
1.) Есть два датацентра, в каждом - инсталляция CH
2.) Хотим _в пределах дц_ репликацию между хостами (ReplicatedReplacingMergeTree)
3.) Хотим писать данные в каждом дц в Distributed таблицу над реплицированными
4.) Хотим читать данные с обоих дц через Distributed таблицу
Конфигурация:
https://gist.github.com/alex-krash/e33aafa298c6918565618c71cc53e8d7 -
-
-
Приветствую. А подскажите, вот на примере, скажем, Метрики. Есть таблица Визитов и Просмотров. Визиты как-то из Просмотров аггрегируются или пишутся отдельно, собираясь в каком-то менеджере сессий?
Пробую делать подобную аггрегацию через MATERIALIZED VIEW и AggregatingMergeTree, но из-за того, что нужно делать доаггрегацию, работает все очень медленно.
Идея в том, чтобы записывать только Просмотры, а представление их сразу в Визиты группировало и сохраняло. -
-
-
-
-
ну еще вариант есть использовать SummingMergeTree в представлении, сейчас ковыряем этот вариант, но разработчикам то наверняка виднее как правильно делать.
-
-
у нас были извращенцы другого толка 🙂
-
-
SELECT list.ip, geo.city, geo.start, geo.end
FROM list, geo
WHERE list.ip BETWEEN geo.start AND geo.end
такой срабатывает? -
Может кто сталкивался с подобной ситуацией. clickhouse-server в лог файле полностью не протоколирует большие SELECT-ы. Возможно данное ограничение отключить? Пробовал с различными настройками <logger><level>trace</level></logger> и <logger><level></level>debug</logger>. Например при размере SELECT-а более 100518 символов, запрос протоколируется и обрезается после 100518 символа.
-
Наткнулся на странное поведение.
SELECT *
FROM videoStatements
┌─learnerId─┬─videoId─┬─Range─┐
│ 1 │ test │ [0,3] │
└───────────┴─────────┴───────┘
┌─learnerId─┬─videoId─┬─Range──┐
│ 1 │ test │ [6,10] │
└───────────┴─────────┴────────┘
2 rows in set. Elapsed: 0.002 sec.
:) select range(Range[1]) as fullRange from videoStatements
SELECT range(Range[1]) AS fullRange
FROM videoStatements
┌─fullRange─┐
│ [] │
└───────────┘
┌─fullRange─────┐
│ [0,1,2,3,4,5] │
└───────────────┘ -
По идее должно быть две строки с [0,1,2] и [0,1,2,3,4,5]
-
SELECT Range[1]
FROM videoStatements
┌─arrayElement(Range, 1)─┐
│ 0 │
└────────────────────────┘
┌─arrayElement(Range, 1)─┐
│ 6 │
└────────────────────────┘ -
Движок Memory
-
Почему должно получаться [0,1,2] ?
-
Блин...мой косяк. Array indices is 1-based
-
Не знал про это )
-
-
-
Подскажите пожалуйста как суммировать точно флоаты
А то каждый раз разный результат -
суммировать флоаты "точно" - никак, храните интом
-
>> А то каждый раз разный результат
а вот это подозрительно -
это нормально. при разном порядке суммирования может получаться разный результат
-
-
Joined.
-
Всем привет. Я новичок в sql. Не создается таблица в бд, подскажите, что не так я указываю в запросе?
-
Date DEFAULT "ЗНАЧЕНИЕ"
https://clickhouse.yandex/docs/ru/query_language/queries.html?highlight=default -
как его правильно указать, ошибка выходит, если так: Date DEFAULT toDate(Date)
-
Date DEFAULT today()
-
Хотя возможно и без скобок сработает
-
а сейчас, что не так, подскажите пожалуйста
-
Добавить скобочки
-
Вот пример
https://github.com/yandex/ClickHouse/blob/1d836b2bf8fef378d47258957ff74ed3a4aff136/dbms/tests/queries/0_stateless/00158_buffer_and_nonexistent_table.sqlyandex/ClickHouseClickHouse is a free analytic DBMS for big data.
-
спасибо
-
-
Всем привет, не подскажите, как через tabix csv-файл вставить в таблицу? Пробовала INSERT INTO ads.gender_urls FORMAT CSV gender_urls_result.csv предварительно загрузив файл, пишет
DB::Exception: Cannot parse input: expected , at end of stream.: (at row 1) -
-
ClickHouse не поддерживает такой синтаксис
https://clickhouse.yandex/docs/ru/query_language/queries.html#select -
С недавних пор мы поддерживаем DATE как алиас для Date для совместимости.
-
Должен нормально работать. Но я бы не рекомендовал использовать такое сложное решение ради простой задачи.
-
Если писать напрямую в шарды, то проблем нет - данные сразу попадают куда надо.
-
Та самая штука, которую мы сейчас делаем - это и есть point in polygon :)
-
По Date нет полноценного индекса - только min/max значения для отсечения целых кусков данных. Если в запросах будут условия на Date, то надо иметь её в первичном ключе, если нет - то бесполезно. Порядок тоже важен. (ID, Date) лучше, когда выбираете один ID и диапазон Date. Наоборот (Date, ID) лучше, когда выбираете одну Date и множество/диапазон ID.
-
Если нет проблем с производительностью при подсчёте налету,
или если иначе вам пришлось бы создавать очень много разных MAT. VIEW,
то лучше считать налету. -
Работает с ключом ровно так, как вы пропишите в движке таблицы для MAT. VIEW.
(Для MAT. VIEW можно прописать произвольный движок таблицы.) -
Хм, у меня исходная таблица - узкая, а конечная - широкая, вот я и думаю как лучше ...
-
Спасибо за ответ. Все муки из за попытки заставить работать отказоустойчивый кластер clickhouse в kubernetes
-
Если эта ошибка появилась после апдейта ClickHouse, то это значит, что при апдейте были изменены конфиги пользователей (users.xml) и в них как-то изменились права доступа. Хотя конфиг по-умолчанию из пакета разрешает доступ пользователю default без пароля. Можно посмотреть на конкретном сервере, откуда приходит ошибка, почему он не разрешает пользователю default соединиться.
Кстати, для удобства обновлений, можно держать оригинальные конфиги из пакета без изменений, а все изменения прописывать в отдельных файлах в conf.d, users.d директориях. Так ещё и проще следить за множеством изменений. -
У нас в следующем релизе будет команда для сброса DNS кэшей
(Запрос SYSTEM DROP DNS CACHE).
(По SIGHUP пока не предусмотрено.) -
Да, такая конфигурация возможна. Я только не понял, вы хотите чтобы разные ДЦ содержали разные данные (были "шардами") или одинаковые (были "репликами"). В зависимости от этого, нужно прописать конфигурацию в remote_servers для "unioned" кластера (в примере прописано как два шарда - это значит, что Distrbuted таблица при SELECT пойдёт в оба ДЦ, выберет в каждом по одной реплике, и объединит разные данные).
-
Алексей, подскажите, а как дела с фичей, которая позволит запрашивать внешние таблицы (из других бд), как таблицы кх, аля fdw ? Вы говорили, что вроде кто-то у вас такое пытается сделать. Возможно, что в ближ перспективе появится ?
-
Да, такой JOIN сделать не получится. Но можно по-другому.
Специально для работы с диапазонами IP адресов есть словарь ip_trie:
https://clickhouse.yandex/docs/en/dicts/external_dicts.html#ip-trie -
Визиты в Метрике вычисляются не из данных в ClickHouse, а с использованием отдельной структуры данных (базы), которая для этого сделана. В ClickHouse пишется результат - лог изменений визитов.
Это всё потому что считать визиты сложно. -
Это весьма необычно. Даже трудно предположить - неужели клиент пробует отправить пароль с добавленным символом перевода строки на конце. Разбираться пока не буду.
-
Так и есть. Настройка
log_queries_cut_to_length
по-умолчанию, 100000.
Влияет как на логгирование в текстовый лог сервера, так и на query_log.
Сделано, чтобы query_log не был слишком уж большим.
Вы можете увеличить эту настройку по своему усмотрению. users.xml -
Да, эту фичу ради эксперимента пробует делать сотрудник из другого отдела.
Пока ничего нет. -
Коллеги! Есть много csv файлов какой оптимальный способ загрузки? Неужели clickhouse-client --query=???
-
clickhouse-client --query="INSERT INTO table FORMAT CSV"
весьма оптимально загружает данные, если рассматривать загрузку в один поток.
Можно быстрее, если запустить несколько таких загрузок параллельно.
Если файлы маленькие, то можно склеить с помощью cat. -
Спасибо, Алексей!
-
А уже выбрали инструмент, где можно выкладывать, такие вот советы и рекомендации. В чате их набралось уже достаточно
-
Нет, так и не выбрали.
-
А что нужно? Мне бы очень хотелось хоть чем то помочь )
-
Я могу развернуть на pythonanywhere )
-
Пока ещё не знаю. Главное - максимальное простое добавление новых Q&A, буквально парой кликов. Поэтому GitHub отпадает.
Сейчас создал задачу
Выбрать способ держать на официальном сайте базу вопросов и ответов.
Требования:
- максимальное простой способ добавления записи, буквально парой кликов (copy-paste из чата).
Во вторую очередь:
- возможность добавления записи пользователями;
- теги, рейтинг и упорядочивание. -
#faq
-
-
Спасибо за ответ!
Каждый дц - сам себе шард. Ожидаемое поведение - как вы описали (мёрж результатов выборки из 2 дц) - 02 September 2017 (22 messages)
-
Алексей, спасибо! После добавления опции select-ы начали помещаются в log.
-
Алексей, спасибо за объяснение!
-
-
-
-
да, почти сразу появится
-
если будет ошибка в конфиге, кликхаус напишет тебе в лог
-
так что пиши, не стесняйся, ничего не сломаешь
-
-
Привет. А можно ли как-то управлять лидер-репликами? Если лидер уходит в "медленный" датацентр, все встаёт колом.
-
Привет. Да, недавно сделали.
https://github.com/yandex/ClickHouse/blob/master/CHANGELOG.md
...
Added new settings for MergeTree engines (the merge_tree section in config.xml):
...
replicated_can_become_leader can prevent a replica from becoming the leader (and assigning merges).ClickHouse/ClickHouseClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
Можно проверить соответствие пути к файлу и параметру dictionaries_config в config.xml
-
То есть надо поставить replicated_can_become_leader в 0 на конкретной реплике, правильно я понял?
-
Да. config.xml, в <merge_tree>.
-
Господа, 9ый дебиан мимо да ?
-
clickhouse-server-base : Depends: libc6 (< 2.24) but 2.24-11+deb9u1 is to be installed
-
-
-
-
-
-
- 03 September 2017 (44 messages)
-
Можно скачать вручную deb-пакеты, распаковать их, и отредактировать зависимость (поставить 2.25 например), запаковать назад, и установить
-
-
Мне в плейбук... Там так низя.
-
Добрый день!
У меня есть огромная таблица, на 3.5 млрд строк. Но мне нужны данные например только за последний месяц, а там данных на 3-4 месяца. Как мне удалить часть таблицы? Проблема в том что запросы по этой таблице очень медленные и иногда не хватает памяти -
а почему бы не ограничивать запрос в where created_at_date >
-
SELECT
ad_tag_publisher_id,
ad_tag_id,
publisher_id,
advertiser_id,
toUInt32(count()),
toDate('2017-09-02'),
toDateTime('2017-09-02 12:59:59'),
geo_country,
device_type,
request_type
FROM statistics.daily_statistics
WHERE (date_time >= toDateTime('2017-09-02 12:55:00')) AND (date_time <= toDateTime('2017-09-02 12:59:59'))
GROUP BY
ad_tag_publisher_id,
ad_tag_id,
publisher_id,
advertiser_id,
geo_country,
device_type,
request_type -
я делаю вот такой вот запрос
-
наверное его тормозит group by?
-
973 rows in set. Elapsed: 438.956 sec. Processed 3.44 billion rows, 222.69 GB (7.83 million rows/s., 507.31 MB/s.)
-
вот результат
-
вечность)
-
hdd?
-
да
-
покажи create table
-
А какой индекс?
-
CREATE TABLE statistics.daily_statistics ( request_id String, ad_tag_publisher_id String, ad_tag_id UInt32, publisher_id UInt32, advertiser_id UInt32, date Date, date_time DateTime, request_type String, geo_country String, device_type String) ENGINE = Distributed(datalayer, \'statistics\', \'daily_statistics_replicated\', rand())
-
а, это вьюха
-
CREATE TABLE statistics.daily_statistics_replicated ( request_id String, ad_tag_publisher_id String, ad_tag_id UInt32, publisher_id UInt32, advertiser_id UInt32, date Date, date_time DateTime, request_type String, geo_country String, device_type String) ENGINE = ReplicatedMergeTree(\'/clickhouse/tables/{shard}/daily_statistics_replicated\', \'{replica}\', date, request_id, (request_id, ad_tag_publisher_id, ad_tag_id, publisher_id, advertiser_id, date, date_time), 8192)
-
вот таблица сама
-
А, если выборка по времени, то date_time дожен быть впереди в индексе
-
я понял в чем дело
-
если я сделаю
WHERE (date_time >= toDateTime('2017-09-02 12:55:00')) AND (date_time <= toDateTime('2017-09-02 12:59:59')) >>>AND date = toDate('2017-09-02')<<< -
то выполняется быстро
-
за 40 секунд
-
получается что если я четко задаю date оно ищет только в рамках того дня
-
спасибо!
-
да
-
я поэтому выше написал про created_at_date
-
это кластеризующий индекс
-
да, я понял. Спасибо
-
У нас тоже сейчас 3,5 млрд но стирать не собираемся
-
И ssd
-
У нас каждый день сейчас добавляется до 500 млн строк
-
Но как бы скорость вообще не важна, главное возможность делать запросы
-
А если запрос будет работать две недели? )) Скорость не важна? )
-
Ну всеравно пока запрос по 500 млн записей работает меньше минуты и это ок
-
вы неделю работаете что ли? =)
-
блин, вам конечно SSD нужен, но дорого будет
-
а есть какое нибудь элегантное решение для
bitOr([1,2,3,...]) = 1 | 2 | 3 | ...
что нибудь типа мапредюса? -
Joined.
-
Привет, у меня миллионы чисел с разным кол-вом знаков после запятой от 0 до 8 знаков, как лучше хранить их в clickhouse? UInt64 с умножением на 100000000? или есть какие то специальные типы которые уже умеют делать умножение/деление при вводе/выводе
75652477291.04
11.00046342
1.01 -
-
в документации написано: Не рекомендуется хранить числа с плавающей запятой в таблицах.
-
- 04 September 2017 (144 messages)
-
Joined.
-
-
-
-
смотри, вот так у меня выглядит словарь, который генерируется внешней системой:
-
<dictionaries>
<dictionary>
<name>hostnames</name>
<source>
<file>
<path>/opt/retroview/priv/hostnames.csv</path>
<format>CSV</format>
</file>
</source>
<lifetime>
<min>300</min>
<max>360</max>
</lifetime>
<layout><complex_key_hashed/></layout>
<structure>
<key>
<attribute>
<name>server_id</name>
<type>String</type>
</attribute>
</key>
<attribute>
<name>hostname</name>
<type>String</type>
<null_value></null_value>
</attribute>
</structure>
</dictionary>
</dictionaries> -
это мапит UUID сервера на хостнейм
-
а у тебя какой словарь?
-
<dictionaries>
<dictionary>
<name>geoip</name>
<source>
<file>
<path>/etc/clickhouse-server/GeoIP2-City-Blocks-IPv4.csv</path>
<format>CSVWithNames</format>
</file>
</source>
<layout>
<ip_trie />
</layout>
<structure>
<key>
<attribute>
<name>network</name>
<type>String</type>
</attribute>
</key>
<attribute>
<name>geoname_id</name>
<type>UInt64</type>
<null_value></null_value>
</attribute>
<attribute>
<name>registered_country_geoname_id</name>
<type>UInt64</type>
<null_value></null_value>
</attribute>
<attribute>
<name>represented_country_geoname_id</name>
<type>UInt64</type>
<null_value></null_value>
</attribute>
<attribute>
<name>is_anonymous_proxy</name>
<type>UInt8</type>
<null_value></null_value>
</attribute>
<attribute>
<name>is_satellite_provider</name>
<type>UInt8</type>
<null_value></null_value>
</attribute>
<attribute>
<name>postal_code</name>
<type>String</type>
<null_value></null_value>
</attribute>
<attribute>
<name>latitude</name>
<type>String</type>
<null_value></null_value>
</attribute>
<attribute>
<name>longitude</name>
<type>String</type>
<null_value></null_value>
</attribute>
<attribute>
<name>accuracy_radius</name>
<type>UInt8</type>
<null_value></null_value>
</attribute>
</structure>
<lifetime>
<!— Lifetime of dictionary in memory —>
300
</lifetime>
</dictionary>
</dictionaries> -
-
А в таком случае запрос должен идти от дефолтного юзера или от того, который указан в <remote_servers>?
-
вполне возможно
-
а где можно найти полный changelog не подскажите?)
-
-
-
-
Joined.
-
Иногда во время вставки 100к строчек в кликхаус происходит таймаут
clickhouse error: [999] zkutil::KeeperException: operation timeout, path: /clickhouse/tables/02/daily_statistics_replicated/temp/abandonable_lock-
INSERT INTO statistics.daily_statistics (request_id,ad_tag_publisher_id,ad_tag_id,publisher_id,advertiser_id,date,date_time,request_type,geo_country,device_type) VALUES (?,?,?,?,?,?,?,?,?,?), ...
У вас бывают такие проблемы? Как вы их решаете? -
или просто делать ретрай пока не запишется?
-
Добрый день. Имею кликхаус с таблицей ReplicatedMergeTree. С некоторого момента кликхаус на запросы в http-интерфейс стал отвечать
zkutil::KeeperException: connection loss, path: /clickhouse/tables/sent_notifications/temp/abandonable_lock
в логах зукипера куча ошибок
NoNode for /clickhouse/tables/check_state/temp/abandonable_lock-0001360070
NoNode for /clickhouse/tables/check_state/block_numbers/201708/block-0001211086
ClickHouse client version 1.1.54226.
zookeeper version 3.4.6
Подскажите пожалуйста, куда смотреть и что нажимать, чтобы заработало -
нет, примерно в 1.1.54241 появился
-
официальные пакеты собраны для убунты, и ставить их в дебиан - не самая лучшая идея. Лучше собрать руками.
Кстати совсем недавно появилась возможность собирать через pbuilder для почти любых дебиантов-убунт.
https://github.com/yandex/ClickHouse/blob/master/debian/.pbuilderrcyandex/ClickHouseClickHouse is a free analytic DBMS for big data.
-
да, просто для 8-ки таки работает.
-
собрать руками в плейбук не положишь :(
-
а зачем там sudo ?:)
-
-
Продолжаем скрещивать Табло с КХ. C CAST разобрались, теперь возникла проблема с подстановкой параметров-дат.
Есть запрос
SELECT
site, date, toString(date) as date1, uniqExact(uid) as uv, uniq(uid) as uv0, count() as vv
from
groot3.content_watch
where
date>= <Parameters.date_from> and date< <Parameters.date_to>
group by site, date, toString(date)
Табло подставляет вместо <Parameters.date_from> дату в виде {d '2017-07-01'} и скармливает получившийся запрос драйверу. Драйвер это не переваривает и кадает в КХ запрос в неизменном виде:
SELECT
site, date, toString(date) as date1, uniqExact(uid) as uv, uniq(uid) as uv0, count() as vv
from
groot3.content_watch
where
date>= {d '2017-07-01'} and date< {d '2017-07-02'}
group by site, date, toString(date)
Вот что сами Табло пишут
For example, the ODBC specification details that dates should be specified in SQL statements by using the syntax: {d 'yyyy-mm-dd'}. This format is then translated by the driver to the proper date syntax of the actual database. -
@alexanderzaitsev можно вас попрсить собирать пакеты и для debian 8/9 в туже репу альтинити ?
-
Всем привет! Подскажите с баянистым вопросом, про дубли при репликации. Хочу попробовать на тесте завестись с двумя нодами. Но после инсерта одной записи в Distibuted таблицу получаю две при селекте.
Конфиг вот такой https://pastebin.com/E1YAypgm
При этом на нодах меняется только секция macros, а сама таблица создается так:
CREATE TABLE tesd (...) ENGINE ReplicatedMergeTree('/clickhouse/tables/{slicer_shard}/default/tesd', '{replica}', date, (siteId, date, docUuid), 8192); -
-
интересно. обычно такая ошибка происходит, если есть несколько тегов <layout> или несколько тегов внутри <layout> ... </layout>. Скопировал конфиг себе, распарсился без ошибок.
Возможно, в файле конфигурации есть еще что-то? Не дублируется ли конфигурация для словаря? -
-
Можно сделать sumIf вместо case
-
Либо сделать запрос с кейсом, а поверх него уже сделать запрос на агрегацию нужных данных
-
у меня запрос с кейсом делает из узкой таблицы широкую, по сути генерируя столбцы тут по идее sumif не подойдет же?
-
Если вы собираетесь агрегировать по значениям которые определяются в кейсе, то вполне подойдет
-
если бы не умел ip_trie, была бы ошибка "unknown dictionary layout type"
-
странно, сейчас у меня вообще КХ падает при попытке обработать словарь
-
можно делать case sum() можно делать sum(case ). главное чтобы на пути из select в листья агрегатные функции были один раз. в первом случае case будет работать меньшее число раз.
-
так это мне делать уже в новом запросе? где кейс подзапрос или вместо кейсам?
-
-
Делается типа так select sumIf(...), column from (select с кейсом) group by column
-
на том же конфиге?
-
-
Joined.
-
Кейсов у меня не один, а много вариант оборачивать его sum'ами я пробовал в разных местах, почему то не получается =(
-
Ну самый простой вариант сделать агрегацию сверху. Скажем так без эспейна :) Хотя с данными поверх запроса с кейсом sumIf не нужен :) Там просто sum и группировка по колонке
-
Что-то я запарил
-
не подойдет, тк у меня узкая таблица в которой есть \название счетчика\ его значение \ устройство\ а мне надо это перевести в вид :
\устройство\ счетчик 1\счетчик 2\счетчик3\ -
а, это уже внутри btrie. Значит, конфигурация прочиталась :)
-
-
-
Ну тогда sumIf и три разных агрегата через sumIf, типа sumIf(counter = 'counter1...), sumIf(counter = 'counter2...)
-
-
а куда дальше копать чтобы это взлетело теперь?)
-
И с группировкой по устройству
-
Я бы все-таки попробовал поставить новую версию CH.
Если можете прислать сам csv словаря, и он не очень большой, я попробую воспроизвести у себя. -
пытался скормить ему следующую конструкцию - не взял =(
sumIf(r, "mt like 'pmNoOutgoingPsStreamHsHhoSuccess'") -
Мне кажется в like нужно добавить по сторонам %
-
словарь ~500mb (база maxmind)
-
неа, ничего из этого не помогает,
Code: 10, e.displayText() = DB::Exception: Not found column mt like 'pmAborteds' in block. There are only columns: mts, mt, r, e.what() = DB::Exception
хотя в столбце mt у меня есть это значение... -
а зачем у вас кавычки вокруг второго аргумента?
-
Без них
ode: 43, e.displayText() = DB::Exception: Illegal type String of argument for aggregate function sum, e.what() = DB::Exception -
-
sumIf(r, mt like '%pmNoOutgoingPsStreamHsHhoSuccess%')
-
Вот так попробуйте. Я так не делал, но может сработает )
-
тааак, кажется я облажался, там стринг, я на лету могу же его попросить конвертнуть тип да?
-
-
toInt64(r)
-
-
а можете ссылко поделиться, откуда оно скачивается?
500 mb - это в сжатом виде? -
да! Ура, работает, спасибо огромное!
-
-
500 несжатое, сейчас сожму и выложу куда нибудь вместе с конфигом словаря
-
здорово
-
Это я догадываюсь, но для теста пока и так подойдет я думаю
-
кинул в личку
-
-
-
-
-
-
Joined.
-
-
-
Joined.
-
добре вам
-
Хэй! :)
-
есть вопрос
<clickhouse_remote_servers>
<kolesa-cluster1>
<shard>
<internal_replication>false</internal_replication>
<replica>
<host>s1r1</host>
<port>9000</port>
</replica>
<replica>
<host>s1r2</host>
<port>9000</port>
</replica>
</shard>
<shard>
<internal_replication>false</internal_replication>
<replica>
<host>s2r1</host>
<port>9000</port>
</replica>
<replica>
<host>s2r2</host>
<port>9000</port>
</replica>
</shard>
</kolesa-cluster1>
</clickhouse_remote_servers> -
дистребьютед таблица, смотри на мержтри
-
хочу добавить еще один шард с репликой, чтобы снизить нагрузку на существующие серваки
-
шардится по rand()
-
могу просто довешать серваки в конфигах? перешардить не принципиально, главное - нагрузку распределить на запись
-
Добрый день.
Что-то у меня не работает arrayJoin, после применения к массиву, полученному из splitByChar
Тип поля по toTypeName Nullable(Array(String))
в чем может быть проблема? -
"ARRAY JOIN requires array argument"
-
При попытке скастить в not-nullable массив Cannot convert data from a nullable type to a non-nullable type
Есть какой-нибудь по-любому workaround? -
В случае использования реплицированных таблиц, есть возможность перешардировать данные - смотрите раздел “Перешардирование”. Но во многих случаях лучше обойтись без этого. Запросы SELECT отправляются на все шарды, и работают независимо от того, каким образом данные распределены по шардам (они могут быть распределены полностью случайно).
Правильно ли понимаю, что достаточно дописать новые серваки в конфиг и на этом все? -
Да. И изменение веса старых
-
Нагрузка при чтении в данный момент не важна, значит можно и весы не менять? Или же лучше уравнять временными весами объем данных по шардам?
-
Это скорее чтоб запись на старые шарды не шла
-
Дык нагрузка на отдельный существующий шард на запись снизится с 1/2 общей нагрузки до 1/3. Это то, что я и пытаюсь получить в данный момент.
-
Нагрузка на чтение будет на старые шарды существенно выше, это я понимаю.
-
В общем, ясно. Спасибо за коммент.
-
Короче предлагаемый способ расширения это перестать писать на старые шарды и поставить новые
-
-
Новый шард не справится со всей нагрузкой.
Думаю на старые два поставить вес по 1, на новый шард вес 2. Через какое-то время, когда примерно объем данных уравняется, выставить одинаковый вес на все шарды. -
Следующий ClickHouse Meetup состоится в Берлине, 5 октября.
https://www.meetup.com/ClickHouse-Meetup-Berlin/
Это первый крупный англоязычный митап.
Мы рады пригласить всех, кто сможет приехать!
Участие бесплатно. Необходимо зарегистрироваться:
https://events.yandex.com/events/meetings/05-10-2017/register/ClickHouse Meetup Berlin (Berlin, Germany)ClickHouse (https://clickhouse.yandex/) is an open source column-oriented database management system capable of real time generation of analytical data reports using SQL queries.ClickHouse (https://cl
-
None
-
Коллеги! У меня в таблице куча полей с типом string . учавствуют в условии where. Это сильно бьет по перфомансу?
-
-
просто where Field ='Word'
-
event_date - используется т/е ключь ?
-
Мы чтобы уйти от строк используем и храним CityHash() - там где можно, типа OS и т/д
-
Таблица ок 4 яров . date есть, но люди хотят за весь период. я просто думаю надо ли переделывать на словари. или и так норм?
-
Можете словари лучше словари - имхо int лучше чем string
-
Весь периуд - full scan получается )
-
Roman, [04.09.17 18:42]
"ARRAY JOIN requires array argument"
Roman, [04.09.17 18:50]
При попытке скастить в not-nullable массив Cannot convert data from a nullable type to a non-nullable type
Есть какой-нибудь по-любому workaround?
Алексей, посоветуете какой-нибудь work around? -
А чем лучше то ) быстрее? или место экономится?
-
быстрее. ну и если данные можно уложить в тот же int, то лечше это сделать. как минимум для экономии места
-
Сравнение строк в ClickHouse реализовано достаточно эффективно. Но в любом случае, работа со строками будет менее эффективна, чем с соответствующими Enum-ами или числами. По причине того, что строки надо разжать, десерализовать, пройтись по ним в оперативке при вычислениях. Насколько именно будет разница - трудно заранее сказать. Обычно до нескольких раз в худшем случае.
-
Можно arrayMap(x -> ifNull(x, 0), arr)
-
Через map пробовал , то же ARRAY JOIN requires array argument
-
SELECT arrayJoin(arrayMap(x -> ifNull(x, 0), spl)) FROM (
select splitByChar(',', splitByChar('|', answers)[5]) spl from Events WHERE ...
) -
Попробуйте вместо ifNull(x, 0) написать assumeNotNull(x)
-
Не помогает. Вероятно потому что массив, получающийся в результате все равно типа Nullable(Array(String))
-
возможно,
SELECT arrayMap(x -> ifNull(x, 0), arrayJoin(spl)) FROM (
select splitByChar(',', splitByChar('|', answers)[5]) spl from Events WHERE ...
)
? -
а он тогда разве применит не до arrayMap? Не помогает, в arrayJoin вероятно нельзя отправить Nullable(Array(String))
-
И надо его как-то превратить в не nullable, при том что у меня там всегда значения есть (
-
да, неправильно сказал
-
SELECT arrayJoin(spl) FROM (
select arrayMap(x -> assumeNotNullable(x), splitByChar(',', splitByChar('|', answers)[5])) spl from Events WHERE ...
)
? -
arrayMap вернет nullable array, так тоже пробовал
-
а вот такой запрос работает?
select arrayJoin(vals) from (select ['a', 'b', Null] as vals) -
ага
-
а такой ?
SELECT splitByChar(',', toNullable('1,2,3')) -
кстати, какая версия CH?
-
ага, а arrayJoin на него уже не работает
-
в последней версии не должен :)
-
не, у нас не последняя (
-
наверное, answers - это nullable строка, и можно попробовать снять с нее каст
-
SELECT arrayJoin(spl) FROM (
select splitByChar(',', splitByChar('|', assumeNotNullable(answers))[5]) spl from Events WHERE ...
)
? -
ооо, точно, не догадался
Спасибо :) -
отлично :)
-
-
вам спасибо, помогли найти баг
- 05 September 2017 (165 messages)
-
-
-
-
Посмотрели – конфиги не менялись, с последними темплейтами они совпадают. В логах на конкретном сервере нет ничего кроме этого:
2017.09.05 08:24:50.142653 [ 139 ] <Debug> TCPHandler: Connected ClickHouse ClickHouse replica version 1.1.54245, database: local, user: default.
2017.09.05 08:24:50.164299 [ 139 ] <Error> ServerErrorHandler: Code: 194, e.displayText() = DB::Exception: Password required for user default, e.what() = DB::Exception, Stack trace:
Не могу понять, правильно ли, что запрос идет от default-юзера, а не от того, что указан в параметрах репликации? -
Конфиг users-preprocessed.xml одинаковый на серверах? Есть подозрение, что они у вас разошлись
-
у нас только users.xml, и файлы одинаковые, потому что накатываются ансиблом. проверил диффом для уверенности – совпадают.
-
Ну *-preprocessed же вроде генерится кликхаусом при применении конфига users.xml или config.xml, их надёжнее сравнивать
-
а лежать они должны там же, где и обычные конфиги или отдельно?
-
я не знаю по каким правилам кладутся эти файлы, но у нас их кликхаус кладет всегда в папку с конфигами users.xml и config.xml, рядом
-
про них вот тут можно почитать https://clickhouse.yandex/docs/ru/single/#configuration-files
-
спасибо, сейчас буду смотреть, почему файл не создался
-
на данный момент нельзя. разве что закомментировать все null_value в структуре словаря и пробовать добавлять по одному.
пробдемы с числами менее вероянты, чем со строками. возможно, надо добавить или убавить escape символов -
-
разницы нет
-
-
-
-
-
Судя по описанию таблиц тут два шарда. Без репликации. Стало быть сами данные никуда не перекинутся.
-
Если хочется репликации, то должны быть одинаковые первые аргументы и разные вторые.
-
-
-
Нет. Шард должен быть одинаковый.
-
Ну и кажется что у вас неправильное использование макросов для подстановки. Так наверное тоже будет работать, но идея вообще другая.
-
Там суть в том чтобы везде написать {shard} и {replica} а уже в конфигах на конкретных машинах прописать нужные значения.
-
а у вас есть разница между числом из первого варианта и массивом длиной в один элемент из третьего?
-
спасибо, сейчас попробую
-
Не понял вопроса =(
-
нужно ли уметь отличать Null от [] и 1636 от [1636] ? если нет, то обычный массив. Иначе, вероятно, придется разбить на 2 колонки.
-
NULL от 0 нужно отличать, если же данных нет и там пустота, то хотелось бы интерпритировать этот как NULL а не 0
-
в качестве Null можно использовать пустой массив
-
а в качестве числа - массив из 1 элемента. разумеется, если не неужно различать эти случаи
-
хм, спасибо буду пробовать
-
После DETACH/ATTACH partition ClickHouse упал с сегфолтом
2017.09.05 11:00:53.485950 [ 6 ] <Error> void DB::BackgroundProcessingPool::threadFunction(): Code: 246, e.displayText() = DB::Exception: bad size of marks file `/var/lib/clickhouse/data/reports/tmp_reports_advertiser_full/20170903_20170903_30_30_0/raw_clicks.mrk':1803, must be: 2240: (while reading column raw_clicks): (while reading from part /var/lib/clickhouse/data/reports/tmp_reports_advertiser_full/20170903_20170903_30_30_0/ from mark 0 with max_rows_to_read = 8192), e.what() = DB::Exception, Stack trace:
2017.09.05 11:03:44.809514 [ 28 ] <Error> BaseDaemon: ########################################
2017.09.05 11:03:44.809557 [ 28 ] <Error> BaseDaemon: (from thread 27) Received signal Segmentation fault (11).
2017.09.05 11:03:44.809568 [ 28 ] <Error> BaseDaemon: Address: NULL pointer.
2017.09.05 11:03:44.864195 [ 28 ] <Error> BaseDaemon: 0. clickhouse-server(tc_new+0x80) [0x39b6650]
2017.09.05 11:03:44.864269 [ 28 ] <Error> BaseDaemon: 1. clickhouse-server(std::_MakeUniq<DB::IMergedBlockOutputStream::ColumnStream>::__single_object std::make_unique<DB::IMergedBlockOutputStream::ColumnStream, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, char const* const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, char const* const&, unsigned long&, DB::CompressionMethod&, unsigned long&, unsigned long&>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, char const* const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&, char const* const&, unsigned long&, DB::CompressionMethod&, unsigned long&, unsigned long&)+0xed) [0x2dff16d]
2017.09.05 11:03:44.864294 [ 28 ] <Error> BaseDaemon: 2. clickhouse-server(DB::IMergedBlockOutputStream::addStream(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, DB::IDataType const&, unsigned long, unsigned long, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)+0x5ea) [0x2dfc5ba]
лог https://gist.github.com/kshvakov/5954f73e88b51e314e11938a7d31d783 -
-
Ребят в таблицу типа Buffer писать в 100 потоков по 1 строке за запрос норм? )
-
Ребята у меня такая беда, есть шард с 2мя репликами, если реплика перезапускается то у нее меняется айпишник, реплика которая не перезапускалась продолжает стучать в старый айпи, приходится опускать обе реплики для восстановления кто то сталкивался? как победить?
-
Алексей писал, что КХ на пожизненно кеширует DNS. Надо сервер КХ рестартить
-
обращаться не по ip?
-
На всем кластере
-
Даже если hostname прописан и у hostname сменился айпишник, надо рестартить сервера на кластере, которые работают с этим hostname
-
-
-
Вот собственно ответ на похожий вопрос
-
-
Хыыы ) Поэтому его уволили :D
-
Добрый день. Подскажите, как к массиву pushнуть значение из колонки такого же типа, что и элементы в массиве? Что-то ничего похожего на push не могу найти
-
arrayPushBack/arrayPushFront уже лежат в мастере, но в билдах хорошего способа пока нет
-
вот такой раньше предлагали:
SELECT
[1, 2] AS x,
[3, 4] AS y,
arrayReduce('groupArrayArray', [x, y]) AS xy -
или
SELECT
[1, 2] AS x,
3 AS y,
arrayReduce('groupArrayArray', [x, [y]]) AS xy
в данном случае -
Нормально, так как таблица лежит в памяти. Но может тормозить.
-
Просто у меня много обработчиков выполняют задачи и мне нужно в реальном времени без задержек видеть что творится в обработчиках и хранить собственно историю.
-
без тестирования сложно сказать. возможно, придется предобрабатывать данные вне CH
-
Только что словил вот этот issue: https://github.com/yandex/ClickHouse/issues/827 Не предполагается update-ов на эту тему?Cannot Insert data into ReplicatedMergeTree #827
(Replicated OutputStream): Block with ID 9125361514582012557_14309323673096342990 already exists; ignoring it (removing part 20170506_20170506_265_265_0) I would like to know if this is normal, and in what scenario will happen?
-
мне написать issue на гитхабе ODBC-драйвера?
-
-
Наверное, уже видели? @milovidov_an https://habrahabr.ru/company/pvs-studio/blog/337182Передаю привет разработчикам компании Yandex
Приблизительно раз в полгода нам пишет кто-то из сотрудников компании Yandex, интересуется лицензированием PVS-Studio, качает триал и пропадает. Это нормально,...
-
нет, еще не поправили. но задача в процессе
-
прошу прощения, пропустил Ваш прошлый вопрос. ответил в группе
-
-
-
ReplecatedMergeTree должно быть достаточно
-
-
-
при этом, при включении и отключении сервисов zk и мастер и слейв реагируют друг на друга
Если же я пытаюсь создать CREATE TABLE partner.click () ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard1}/_click', 'clickSlave', click_date, id, 8192), то никакого реплицирования не происходит
Уже существующие данные должны подтянуться или их нужно залить еще раз? -
-
И на мастере и на слейве соответственно?
-
должно работать и без макроса. и данные должны сами подтянуться. кластер с зукипиром нормально работает?
-
в кластер входит только два сервера один из них должен быть простой репликой
Сам кластер, как я понимаю, должен ругаться, если мы на разных серверах создаем 2 таблицы с одинаковыми путями, но не ругается,
в самом zkCli (на слейве) при ls /clickhouse/tables/01 не выводятся таблицы, которые должны быть там с мастера -
а если создать какую-нибудь ноду в зукипере в мастере (/test), это видно на слейве?
-
-
-
ну, наверное, у Вас нету кластера, и зукиперы работают сами по себе
-
-
Или кластер это вот эти настройки в clickhouse config?
-
нет, зукипер должен работать независимо от CH
-
-
да. наверное, эта статья может помочь: http://zookeeper.apache.org/doc/r3.4.6/zookeeperStarted.html#sc_RunningReplicatedZooKeeper
-
Ребят. В таблице 53к строк, делаю limit 1 и получаю rows_before_limit_at_least = 8192
-
ааа, при указании серверов в zoo.cfg он требует 3-й сервер, у меня только 2, можно ли указать один и тот же сервер дважды в конфигурации?
-
Я так понял КХ считает кол-во оставшихся строк в блоке данных?
-
А не целиком которые под условие попадают
-
В доке сказало "rows_before_limit_at_least - точное число строк, которое получилось бы, если бы не было LIMIT-а", но на деле это не так )
-
можно указать только 2, но смысла будет ровно столько же, сколько и при 1-м
-
Хм...а если добавить with totals, тогда все ок показывает
-
а group by в запросе есть ? :)
-
Неа, нету
-
Да я просто тестирую эту штуку и делаю запрос из серии select column from table limit 10, 10 format JSON
-
И получаю максимум 8192
-
в доке написано, что точное будет, если есть group by
-
А если делаю with totals, то получаю корректное значение в виде общего кол-ва строк
-
Аааа, сори, пропустил этот кусок (( Хотел увидеть то, что хотел - увидел ))
-
А остальное пропустил )
-
with totals, видимо, включает group by по всему
-
Уазал в конфигах адреса серверов, в кластер подтянулась данные, но при создании таблицы на слейве данных нет
-
Все разобрался, большое спасибо! :)
-
появились? отлично!
-
если я правильно помню, задача в процессе работы, но еще не готова
-
да, кластер в zookeeper должен быть обязательно, а warning'и которые zk выкидывает при 2-х серверах, можно игнорировать (хотя странно как-то)
-
просто, в 2-х серверах зукипера нету смысла. отказоустойчивость для 3-х или 5-и
-
-
-
3, разумеется, лучше :)
-
-
-
подскажите пожалуйста, каким лучше способом пройтись по длинному списку сессий (есть started_at и closed_at) и получить скажем с получасовой точностью количество онлайн сессий?
-
сделать сначала список из интервалов времени и потом к ним приджойнить список сессий?
-
или есть что-то поумнее?
-
-
хорошо пользоваться тем, что делали люди, которым нужно то же самое
-
Коллеги, добрый день. Я собираю данные из метрики в хайве и думаю о переходе на кликхаус. Сейчас простая операция select count(*) from занимает 17 минут (1 миллиард строк). Стоит ли ожидать сильного увеличения производительности?
-
в 4 порядка)
-
-
SELECT count()
FROM daily_statistics
┌────count()─┐
│ 4237627779 │
└────────────┘
1 rows in set. Elapsed: 6.660 sec. Processed 4.24 billion rows, 8.48 GB (636.28 million rows/s., 1.27 GB/s.) -
это на hdd
-
я боюсь, что никак не могу сообразить
-
вот у меня есть sessions: (id, created_at, closed_at)
-
select uniq(id) as count, timeSlots(somedate,7200) as period from sessions array join period where created_at < period and deleted_at > period
-
мне показалось, что нужен такой запрос, но он невалидный
-
@orantius @OlehBahinskyi Спасибо!
-
@OlehBahinskyi а сколько оперативки у вас?
-
@vladimirmyuge 32, но занято меньше 2х
-
Я в какой-то параллельной реальности... можете посоветовать облако, где наиболее просто развернуть это добро, залить гигов 200 и покрутить? навыков линукса у меня почти 0
-
можешь у себя в докере покрутить на локальной машине
-
я имел в виду что-то такое
SELECT
ts,
count()
FROM
(
SELECT
number AS id,
toDateTime('2017-09-05 01:02:03') + (id * 1000) AS begin,
toDateTime('2017-09-05 01:02:03') + (id * 2000) AS end
FROM system.numbers
LIMIT 10
)
ARRAY JOIN timeSlots(begin, toUInt32(end - begin)) AS ts
GROUP BY ts
ORDER BY ts ASC хотя возможно это не совсем то что нужно. -
-
Насколько я понимаю, надо нагенерить точек раз в полчаса и к ним приджойнить весь список сессий. Верно?
-
-
-
в качестве ключа надо использовать tuple. в словаре 1 ключ, но составной
-
-
-
-
например:
select dictGetString('dict', 'attr', (1, 'abcd')) -
-
первые 2 аргумента у dictGetT должны быть константными строками. так что не получится, если я правильно понял
-
-
да, так должно работать
-
-
сделай toUInt64
-
-
-
В доке написано что числа вида 1-9 парсятся сначала в UInt8, а потом уже в UInt16 и так далее
-
к сожалению про это не читал еще
-
Советую прочесть всю документацию, это не долго, интересно и много узнаешь про ClickHouse
-
-
-
-
наверное почитай доку сначала
-
Уточните структуру талбиц, словарей и пример неработающего запроса
-
-
-
-
пока получилось такое:
SELECT
dictGetString('clip', 'meganame', tuple(resource)) AS film,
tuple(dictGetUInt64('clip_mark', 'mark_id', tuple(dictGetUInt64('clip', 'id', tuple(resource))))) AS Genre
FROM stream_log
WHERE date >= '2017-09-01'
GROUP BY
film,
Genre
LIMIT 50 -
-
-
Создайте БД типа Dirctionary и попробуйте заджойнить словать как таблицу
-
-
-
-
-
-
-
+1
-
тогда вам видимо нужен словарь, который работает как multimap.
- 06 September 2017 (144 messages)
-
Joined.
-
-
-
-
Joined.
-
Всем привет!
Столкнулся со странной проблемой, сценарий:
1) есть несколько ReplicatedMergeTree таблиц на кластере из 6 машин,
2) Подключаюсь к одной из тачек
3) Выполняю подряд несколько раз select count(*) из распределенной таблицы
4) Получаю мигающее значение, т.е. если всего, например, 10 записей, то получаю то 10, то 8 записей.
Выяснил, что выпадает одна из тачек, условно с номером 3: один раз я делаю запрос к распределенной таблице и данные с этой 3-ей тачки передаются, другой раз нет.
Причем, если я подключаюсь к этой третьей тачке - значение уже не мигает и все ок.
Я понимаю, что это история про сеть, одна она в принципе стабильна, может какой таймаут увеличить непосредственно в настройках КХ? -
Joined.
-
Привет!
Столкнулся с неточностью в хелпе. Пришлось по исходникам разбрираться.
"4. Восстановление в случае потери всех данных:
...Создайте в ZooKeeper узел /path_to_table/replica_name/flags/force_restore_data с любым содержимым или выполните команду для восстановления всех реплицируемых таблиц: sudo -u clickhouse touch /var/lib/clickhouse/flags/force_restore_data"
Было бы хорошо уточнить что это надо делать для каждой из replicated таблиц, указанных в metadata, во вторых путь к узлу не совсем такой - а именно между path_to_table и replica_name есть обязательный узел "/replicas/"
в итоге путь: /<path_to_table>/replicas/<replica_name>/flags/
И до копирования metadata пришлось руками вызывать 'create database <db_name>' на все базы, иначе почему-то ничего не виделось. -
-
выпал кх с такой ошибкой:
2017.09.06 12:32:34.870000 [ 1 ] <Error> Application: Resource temporarily unavailable
2017.09.06 12:32:34.874625 [ 2152 ] <Error> void DB::ReplicatedMergeTreeRestartingThread::run(): std::exception. Code: 1001, type: std::system_error, e.what() = Resource temporarily unavailable
как понять каких именно ресурсов не хватает? -
я нашел чудесный пример, который подходит для учета онлайн сессий
-
concurrent_sessions_example..txt
GitHub Gist: instantly share code, notes, and snippets.
-
наверное надо только поменять range на timeSlots
-
почему-то этот запрос считает явно не то, чего хотелось
-
-
да, я уже понял
-
-
нельзя ставить timeSlots, потому что получается нерабочий вывод с сессиями у которых deleted_at - created_at меньше получаса
-
и в итоге получаются бессмысленные цифры типа 140 тыс онлайн
-
поэтому надо брать запрос, который выложил Алексей, брать посекундную точность
-
а потом уже округлять до получаса вторым, внешним запросом
-
черт
-
Code: 69, e.displayText() = DB::Exception: A call to function range would produce 235817246 array elements, which is greater than the allowed maximum of 100000000, e.what() = DB::Exception
-
надо менять подход
-
-
можно посмотреть в табличку system.query_log
-
-
-
ее, оказывается, надо заранее отдельно включить
-
тогда посмотреть на наличие кусков в system.parts
-
Падает кликхаус в ответ на команду "show tables" :
1) запускаю сервер docker run —rm -d —name my-clickhouse-server —ulimit nofile=262144:262144 yandex/clickhouse-server
2) запускаю клиент sudo docker run -it —rm —link my-clickhouse-server:clickhouse-server yandex/clickhouse-client —host clickhouse-server
3) Получаю:
ClickHouse client version 1.1.54284.
Connecting to clickhouse-server:9000.
Connected to ClickHouse server version 1.1.54284.
:) show tables
SHOW TABLES
Exception on client:
Code: 32. DB::Exception: Attempt to read after eof: while receiving packet from clickhouse-server:9000, 172.17.0.2
Connecting to clickhouse-server:9000.
Code: 210. DB::NetException: Connection refused: (clickhouse-server:9000, 172.17.0.2) -
кажется нашел ответ
It means that your CPU doesn't support required instruction set.
For Yandex pre-built packages, minimal instruction set is SSE 4.2.
To show supported instruction sets, run cat /proc/cpuinfo.
You may build ClickHouse by yourself (either on target machine or with explicitly limited instruction set during build) and it will work even on older CPUs. -
-
примерно так:
select * from system.parts where toDate(modification_time) = today() and level = 0 and table = ... -
-
-
хотя всеравно же из контейнера запускаю
-
докер не лимитирует набор инструкций
-
-
-
-
-
-
-
дословно вот так
Массив из элементов типа T. Типом T может быть любой тип, в том числе, массив. Многомерные массивы не рекомендуется использовать, так как их поддержка довольно слабая (например, многомерные массивы нельзя сохранить в таблицы с движком семейства MergeTree). -
-
Господа, подскажите что можно сделать, если хочется результат типа runningDifferrence с группировкой?
-
мы добавляем в таблицу столбец sys_created DateTime DEFAULT now()
-
-
-
Массив внутри массива мне нужно...
-
-
-
Якоря начала конца строки?
-
-
-
-
re2 это go же
-
-
Это библиотека в первую очередь
-
-
Генерировать range-и посекундно - это тяжело. Лучше поделить время до получаса, затем применить range, а затем домножить обратно.
Что с timeSlots посмотрю через некоторое время... -
-
WhyRE2
RE2 is a fast, safe, thread-friendly alternative to backtracking regular expression engines like those used in PCRE, Perl, and Python. It is a C++ library. - google/re2
-
Если сессия открылась и через минуту закрылась а вместо нее новая, то при посекундном рассчете это одна онлайн, а вот при округлении до получаса это две онлайн
-
Нужна одна
-
'^[0-9+-\\(\\)\\s]+$'
-
Да, действительно. Жаль, с посекундными получается тяжёло. Но можно попробовать уменьшить размер блока: SET max_block_size = 8192. А также ограничить максимальную длину сессии: range(least(86400, x))
-
Или округли хотя бы до минуты.
-
Я думаю что мне нужна предагрегация и отдельно складывать кол-во онлайн в каждую секунду
-
-
-
Так попробуйте :)
-
-
Обновление MV через View не поддерживается.
-
-
Непонятно как обойтись без посекундной агрегации
-
Должно.
-
MV это по сути таблица, которая наполняется тригерами
-
У меня работало
-
Я травил MV на MV и работало
-
У меня сессии видеопросмотра и когда человек листает каналы, у него идут сессии одна за одной
-
Но при этом онлайн только одна
-
Мы подобную задачу реализуем, только данные в разрезе видео по просмотру. Например пики внимания по таймлауну видео.
-
Можно попробовать записывать в базу по одному событию каждую секунду просмотра видео. Потом считать с помощью GROUP BY. Это если не слишком много одновременных просмотров. Хотя кажется, что это не лучше, чем размножать налету с помощью range.
-
Мы сделали по другому. У нас есть эвенты во время просмотра видео: запуск, пауза, сик, завершение просмотра. На каждый эвент у нас кумулятивно собираются промежутки просмотра видео.
Пример. Видео длительностью в 60 секунд.
Состояние на момент загрузки страницы
var currentRange = [];
var ranges = [];
Запуск видео.
var currentRange = [0];
var ranges = [];
Пауза на 10 секунде.
var currentRange = [];
var ranges = [[0, 10]];
Сик на остановленном видео с 10 секунды на 30.
var currentRange = [];
var ranges = [[0, 10]];
Запуск видео с паузы на 30 секунде после сика.
var currentRange = [30];
var ranges = [[0, 10]];
Сик на играющем видео с 36 секунды до 50.
var currentRange = [50];
var ranges = [[0, 10], [30, 36]];
Просмотр видео завершен на 60 секунде.
var currentRange = [];
var ranges = [[0, 10], [30, 36], [50, 60]];
Таким образом получаем информацию о том, что обучающимся были просмотрены промежутки видео
0-10, 30-36, 50-60 секунды. -
Потом достаточно просто разбираем данные и считаем например количество уникальных пользователей посмотревших кажду секунду видео, сколько раз вообще была просмотрена каждая секунда видео и пр., где точки отказов и пр.
-
а может тогда считать не count() а uniq(user_id)?
-
-
-
У нас не всегда есть userid и бывает ситуация когда один юзер легитимно смотрит много каналов
-
Спасибо. Сейчас попробую.
-
Например мозаика
-
-
а что произойдет, если удалить одну из папок в data/dbname/tablename у реплицируемой таблицы? недостающие данные подтянутся от другой реплики?
-
Да.
-
Это произойдёт при первой попытке что-то прочитать из испорченных/удалённых данных, или, если данные никто не читает - при следующем запуске сервера.
-
Спасибо.
-
Недавно спрашивал про OPTIMIZE TABLE – как-то странно он работает:
- иногда сразу отвечает OK (меньше секунды задержка), но по графане видно, что процесс оптимизации идет
- иногда выполняется только на одной из двух реплик (видимо, из-за недостатка места на одной)
- долгий ответ, пока не закончится процесс оптимизации. Это, я так понимаю, самый нормальный случай -
> - иногда сразу отвечает OK (меньше секунды задержка), но по графане видно, что процесс оптимизации идет
Обычно это говорит о том, что куски для мержа не выбраны (нечего выбирать - данные уже помержены, мержатся сейчас, есть отсутствующие куски, которые надо скачать с реплики, нет места на диске...), либо выбраны мелкие куски, и они быстро помержены.
> - иногда выполняется только на одной из двух реплик (видимо, из-за недостатка места на одной)
Возможно.
> - долгий ответ, пока не закончится процесс оптимизации. Это, я так понимаю, самый нормальный случай
Да, это самое ожидаемое для крупного мержа. -
Спасибо.
-
Всем привет, у нас есть кейс когда мы делаем detach в одной таблице и перекладываем партиции в другую после чего делаем attach, т.к. в detached складываются не только "отцепленные" партиции, но и битые куски, мы иногда напарываемя на то что мы их синкаем и attach непроходит. Как можно прочекать партиции в detached чтоб синхронизировать только валидные или как можно обезопасить себя от подобного поведения ?
-
Битые должны быть под именем broken_*, ignored_*, unexpected_*...
-
Спасибо, с этим понятно, еще мы вот такую ошибку словили
2017.09.05 11:01:39.052615 [ 26 ] <Error> executeQuery: Code: 228, e.displayText() = DB::Exception: /var/lib/clickhouse/data/reports/advertiser_full/detached/20170903_20170903_30_30_0/raw_clicks.mrk has unexpected size: 1803 instead of 2240, e.what() = DB::Exception (from 192.168.199.21:56144) (in query: ALTER TABLE "reports"."advertiser_full" ATTACH PARTITION 201709), Stack trace:
полный лог
https://gist.githubusercontent.com/kshvakov/5954f73e88b51e314e11938a7d31d783/raw/3e8402d30a035123813cb09ee741559e95663f4c/ch_segfault.log -
В логе всё плохо. А версия сервера какая?
-
-
Мы пока что думаем, что это хорошая версия. Но что-то не так. В логе две проблемы: 1. Откуда-то появился кусок с неправильными данными. 2. sefgault.
По трейсу источник проблемы не удаётся понять. Насколько это воспроизводимо? -
-
-
Joined.
-
Ребят, всем привет, есть вопрос. Не знаю, как решить средствами КХ.
Есть таблица для ивентов вида:
(
ID UInt32
Event String
GUID String
Path String
IP UInt32
UserID UInt32
TrackedDate Date
)
GUID — идентификатор юзера в браузере (кука), Event — что произошло (page или image), Path — урл события, UserID — некий параметр для группы.
У меня есть задача — получить все ивенты с Path = %success% с Event = page` для которых есть другой Event = image. собственно это решается достаточно легко:
SELECT *
FROM analytics.EventTrack
WHERE (UserID = 92) AND (Event = 'page') and (Path like '%onepage/success%') AND (TrackedDate >= toDate('2017-09-01')) AND GUID IN (
SELECT GUID
FROM analytics.EventTrack
WHERE (UserID = 92) AND (Event = 'image') AND (TrackedDate >= toDate('2017-09-01'))
)
Есть ситуация, когда пользователь сменил браузер, то есть у него может быть два GUID, но одинаковый IP. В реляционной БД я бы сделал алиас для таблицы и в сабквери бы сверял IP и дату (допустим, не больше суток, потому что динамический айпи, все дела).
Как сделать в КХ, понятия не имею. Были мысли пробовать собирать IP адреса с датами в Memory таблицу (не работал ранее). Но правильно ли это? -
так, сорри про подсветку кода, получилось так себе, но лучше, чем просто плейном
-
У нас сейчас похожая история со списком пользователей имеется. Есть определенная бизнес-логика по которой собирается конечный список пользователей по которым агрегировать данные. Мы собираем список, в TSV файлик и вместе с select запросом на сервер в виде временной таблицы. Работает замечательно.
-
Но в вашем случае я полагаю таблица может быть огромная
-
Я бы попробовал подключить словарь и сделать его таблицей
-
не, не сильно )
-
Не уверен на счет производительности, т.к. у меня на таких экспериментах при наличии > 2кк строк был лаг примерно в секунду
-
1 секунда для меня допустимо )
-
там в среднем будет порядка 1000-2000 ip, потому что фильтр идет по типу ивента (он достаточно редкий) и юзеру + дата )
-
Ну тогда можете попробовать подключить внешнюю таблицу в виде словаря и сделать create table dates_ips engine = Dictionary(dict_name)
-
Ну либо как вариант слать файлик в виде временной таблицы на каждый запрос
-
ага, спасиб. сейчас почитаю
-
временную таблицу в памяти из КХ разве нельзя создать?
-
У меня даже 50к строк с идентификаторами достаточно быстро доставляются и запросы отрабатывают очень быстро
-
Она создается автоматически при получении файла при select запросе
-
Сейчас дам ссылку на доку
-
ааа
-
спасибо, буду благодарен!
-
Можно временную таблицу создать и писать туда данные, но есть вероятность их потерять при падении сервера
-
И придется откуда то наполнять при включении сервера
-
эти данные нужны только на момент выборки (отправки запроса по API)
-
то есть я генерирую отчетики на основе таблицы
-
ничего криминального )
-
-
Ну у нас похожая ситуация. Когда например из 10к пользователей данные нужно выдать только по 200 пользователям в силу того, что к другим данным пользователь делающий запрос доступа не имеет. Приходится делать кучи проверок, вываливать список в файл и слать на сервер.
-
ага-ага
-
пошел копать )
-
благодарю
-
-
я бы делал внешний словарь, который содержит текущую проклейку пользователей в виде guid-> id связной компоненты склейки, и отдельным процессом лопатил эти же логи на предмет одинаковых ip или еще какая логика вам в голову придет. словарь потом можно использовать двумя способами, 1. при вставке данных забирать в события текущее состояние склейки 2. при чтении забирать последнее наиболее актуальное состояние.
дальше, в вашем запросе "все события1 для которых есть событие2" происходит что-то вроде джойна на себя же по (userid, guid) при этом достаточно произвольное условие на дату, т.е. события могут быть в любом порядке. и любом количестве. может так и должно быть. в любом случае, количество guid со временем неограниченно растет, возможны спецэффекты.
дальше, если вы будете шардировать хранение, вам желательно организовать данные так, чтобы объединение результатов на шардах происходило как можно позже, например чтобы джойн был локальным на шарде. это значит что данные должны шардироваться так, чтобы история одного человека попадала в одну машину. это вряд ли получится, если например у вас для guid динамическое объединение в одного человека. это не значит что так не надо делать, просто надо понимать последствия. хотя если у вас id события int32, то возможно вам это не нужно. и ip только v4.
в целом задача про последовательности событий в реляцинном случае обычно включает в себя джойн большой таблицы на саму себя по ключу с большой кардинальностью, и нормально не работает. но возможно у вас все не так плохо. -
> в целом задача про последовательности событий в реляцинном случае обычно включает в себя джойн большой таблицы на саму себя по ключу с большой кардинальностью, и нормально не работает. но возможно у вас все не так плохо.
именно так сейчас и почти доделал 😄 -
а за словарь спасибо, я его тоже хочу пощупать
-
пока шардирования нет. отчет генерируется, все ок )
-
спасибо за столь развернутый ответ! очень интересное решение, попробую
- 07 September 2017 (62 messages)
-
Коллеги, доброго времени суток.
Мне кажется, где-то тут проскакивала информация, что при определенных обстоятельствах в ClickHouse, начинает разрастаться размер ZK snapshort. Можете скинуть ссылку на обсуждение/детали? -
похоже у меня это случилось
-
сегодня ZK навернулся и потянул за собой другие сервисы (кроме CH)
-
поломали в 1.1.54276 поправили в 1.1.54284 https://github.com/yandex/ClickHouse/blob/master/CHANGELOG.mdClickHouse/ClickHouse
ClickHouse® is a free analytics DBMS for big data. Contribute to ClickHouse/ClickHouse development by creating an account on GitHub.
-
хм... у меня 1.1.54245
значит не то -
снапшет ZK ~2G, кто-то знает, как найти основного "потребителя" места?
-
du -hcs ./* | sort -h
-
я не про файловую систему
-
я про znode
-
какие ветки в ZK делают в клад в этот снапшет
-
или эта командя для zkcli?
-
-
Всем добрый день! Я правильно понимаю, что чтобы сменить тип одной колонки с Int32 на UInt32, например, необходимо создать новую таблицу с измененным типом этой колонки и INSERT'ить в нее данные ?
-
есть MODIFY COLUMN: https://clickhouse.yandex/docs/ru/single/#alter
-
ok, спасибо
-
Добрый день всем . Есть новости по возможности обновления данных и удалении ? Или может в тестовых сборках что есть ?
-
Конец года - начало 18, вроде в roadmap
-
DB::Exception: ALTER of key column column_name must be metadata-only.
-
нет возможности модифицировать первичный ключ...
-
Подскажите по AggregateState
Задача: выгрузить из CH пользователей который - сделали то-то и показывать им что-то.
Идея: если взять AggregateState : uniqHLL12State или uniqCombinedState или что-то другое на фильтре Блума, передать это значение в рекламную сеть на Java - тогда если повторить алгоритм hhl12/... на java - можно быстро отвечать входит пользователь в множеcтво или нет ( с погрешностью)
Как думаете эта идея будет работать или в каком направлении копать?
Может кто то партировал CH алгоритмы вхождение уников на Java ? -
-
А зачем в java это обрабатывать? оО Стейт все равно может жирный получить, либо можно поверх запроса который стейт собирает просто сделать каунт с фильтром по конкретному пользователю
-
И портируй не портируй стейт куда либ, данных меньше читаться не будет
-
А просто по хэш таблице проверить в Java вхождение я не вижу смысла ) можно запросов поверх проверить...быстрее будет (в плане не надо будет ничего портировать и пилить костыли)
-
У нас рекламные сервера на Java - которые знать не знают про CH и что в нем хранится ( т/е они не читают из него данные) работаю с ооочень маленьким набором данных.
Есть внешний тулл выполняет запрос в CH - получает +-300М UUID, далее получаем uniqHLL12State - и сохраняет только этот State - т/е пару килобайт и передает их рекл. серверам
Идея-
Далее когда поступает запрос от uuid1 или uuid2 мы проверяем входит пользователь в этот State или нет
Проверить можно через добавление в элемента в hhlState - если cout изменился то да... или нет... -
Сейчас используем фильтры Блума - но хочется совместить с CH
-
Joined.
-
Сегодня опять упали с сегфолтом, но тут дело до перемещения партиций вообще не дошло, все что есть в логах
2017.09.07 10:08:17.258574 [ 28 ] <Error> BaseDaemon: ########################################
2017.09.07 10:08:17.272317 [ 28 ] <Error> BaseDaemon: (from thread 27) Received signal Segmentation fault (11).
2017.09.07 10:08:17.272364 [ 28 ] <Error> BaseDaemon: Address: 0x3f7237783
2017.09.07 10:08:18.965770 [ 28 ] <Error> BaseDaemon: 0. clickhouse-server(DB::ColumnVector<unsigned int>::insertData(char const*, unsigned long)+0x16) [0x15b4a26]
2017.09.07 10:08:18.965913 [ 28 ] <Error> BaseDaemon: 1. clickhouse-server(void DB::Aggregator::convertToBlockImplNotFinal<DB::AggregationMethodConcat<TwoLevelHashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true> > >, HashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true> > >(DB::AggregationMethodConcat<TwoLevelHashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true> > >&, HashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true> >&, std::vector<DB::IColumn*, std::allocator<DB::IColumn*> >&, std::vector<DB::PODArray<char*, 4096ul, Allocator<false>, 15ul>*, std::allocator<DB::PODArray<char*, 4096ul, Allocator<false>, 15ul>*> >&, std::vector<unsigned long, std::allocator<unsigned long> > const&) const+0x99) [0x3132d29]
2017.09.07 10:08:18.965963 [ 28 ] <Error> BaseDaemon: 2. clickhouse-server(void DB::Aggregator::writeToTemporaryFileImpl<DB::AggregationMethodConcat<TwoLevelHashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true> > > >(DB::AggregatedDataVariants&, DB::AggregationMethodConcat<TwoLevelHashMapTable<StringRef, HashMapCellWithSavedHash<StringRef, char*, DefaultHash<StringRef>, HashTableNoState>, DefaultHash<StringRef>, TwoLevelHashTableGrower<8ul>, Allocator<true> > >&, DB::IBlockOutputStream&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)+0x965) [0x313f075]
2017.09.07 10:08:18.965994 [ 28 ] <Error> BaseDaemon: 3. clickhouse-server(DB::Aggregator::writeToTemporaryFile(DB::AggregatedDataVariants&)+0x179a) [0x30f4d1a]
2017.09.07 10:08:18.995048 [ 28 ] <Error> BaseDaemon: 4. clickhouse-server(DB::Aggregator::executeOnBlock(DB::Block&, DB::AggregatedDataVariants&, std::vector<DB::IColumn const*, std::allocator<DB::IColumn const*> >&, std::vector<std::vector<DB::IColumn const*, std::allocator<DB::IColumn const*> >, std::allocator<std::vector<DB::IColumn const*, std::allocator<DB::IColumn const*> > > >&, std::vector<unsigned long, std::allocator<unsigned long> >&, std::vector<StringRef, std::allocator<StringRef> >&, bool&)+0x978) [0x30f5898]
2017.09.07 10:08:18.995075 [ 28 ] <Error> BaseDaemon: 5. clickhouse-server(DB::ParallelInputsProcessor<DB::ParallelAggregatingBlockInputStream::Handler, (DB::StreamUnionMode)0>::thread(MemoryTracker*, unsigned long)+0x2c8) [0x305abf8]
2017.09.07 10:08:18.995084 [ 28 ] <Error> BaseDaemon: 6. clickhouse-server() [0x399d05f]
2017.09.07 10:08:18.995113 [ 28 ] <Error> BaseDaemon: 7. /lib/x86_64-linux-gnu/libpthread.so.0(+0x76ba) [0x7fe36b7676ba] -
-
логично предположить, что 134217728 bytes - размер очередной аллокации, а лимит певысило суммарное потребление
-
хм, логично
-
-
Добрый день. Подскажите, пожалуйста, почему через определенное время строка может перестать участвовать в схлопывании. Может ли быть так, что возникла ошибка ранее с этой строкой и она навсегда выбрасывается из строк, участвующих в схлопывании, что бы не возникало ошибок в дальнейшем?
-
Это про CollapsingMergeTree?
-
-
Из документации.
Если количество положительных и отрицательных строк совпадает - то пишет первую отрицательную и последнюю положительную строку. Если положительных на 1 больше, чем отрицательных - то пишет только последнюю положительную строку. Если отрицательных на 1 больше, чем положительных - то пишет только первую отрицательную строку. Иначе - логическая ошибка, и ни одна из таких строк не пишется. (Логическая ошибка может возникать, если случайно один кусок лога был вставлен более одного раза. Поэтому, об ошибке всего лишь пишется в лог сервера, и слияние продолжает работать.) -
-
-
Ребят. Есть Nested колонка например с тремя колонками внутри. Если я делаю например sumArray(nested.column1), то фактически данные с остальных двух колонок будут читаться или нет?
-
И можно ли как то приджоинить только одну колонку из nested колонки, а не три сразу?
-
Т.е. делаю я например select nested.column1 from table array join nested. Или остальные колонки и так не читаются из nested?
-
остальные колонки не читаются и так
-
Супер, это то, что надо
-
Спасибо!
-
не уверен, что array join nested сработает. кажется, должно быть array join nested.column1
-
Я тут выше про нехватку памяти писал, вот в этом виео годно Алексей рассказывает что да как https://events.yandex.ru/lib/talks/4556/Link
Приглашаем всех, кто анализирует большие объёмы данных, на встречу, посвящённую СУБД ClickHouse. СУБД ClickHouse, разработанная в Яндексе для нужд Яндекс.Метрики, почти сразу стала использоваться для решения самых разных аналитических задач. ClickHouse работает быстрее всех известных нам СУБД и легко обрабатывает петабайты данных. Это делает СУБД незаменимым инструментом в руках аналитика. Сейчас ClickHouse стала открытым программным обеспечением, так что её могут свободно использовать все. На встрече будет два доклада. Аналитик Яндекса Мария Рыжова покажет типичные задачи, которые легко решаются с помощью этой СУБД, а технический директор проекта СМИ2 Игорь Стрыхарь расскажет о созданном командой СМИ2 Tabix — графическом интерфейсе для работы с ClickHouse. После докладов пройдёт сессия вопросов и ответов. С собравшимися пообщаются аналитики Яндекса, использующие ClickHouse в самых разных сферах. Их можно будет расспросить, как эффективнее всего применять эту СУБД к конкретным задачам. Участие бесплатно…
-
Оно именно так и работает в данный момент
-
-
во втором случае оптимизатор может пробросить условие из where в prewhere, и прочитается меньше кусков
-
также могут сработать ограничения, если столбец находится в первичном ключе
-
да, наибольшее общее условие всех агрегатов запроса можно выносить оптимизатором и применять на более ранних стадиях.
-
пробую удалить партицию
Received exception from server:
Code: 248. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Invalid partition format: 20170801_20170821_0_20882_333. Partition should consist of 6 digits: YYYYMM. -
alter table site_stat_cache DROP PARTITION '20170801_20170821_0_20882_333';
-
при этом
SELECT concat('alter table site_stat_cache DROP PARTITION ''',name,''';') FROM system.parts WHERE /*active and*/ table = 'site_stat_cache' and min_date>='2017-08-01';
┌─concat(\'alter table site_stat_cache DROP PARTITION \\\'\', name, \'\\\';\')────────┐
│ alter table site_stat_cache DROP PARTITION \'20170801_20170821_0_20882_333\'; │
│ alter table site_stat_cache DROP PARTITION \'20170821_20170825_20883_93538_1857\'; │ -
А Nested вообще как под капотом устроено? Просто есть у меня например некоторое количество строк в Nested для каждой строки в основной таблице. И мне по этим Nested строкам нужно будет проводить фильтрации и пр., если смысл вынести уже отфильтрованные данные в соседнюю колонку или особой разницы не будет?
-
устроено как несколько массивов с общим значением offset. Насчет смысле не уверен.
-
спасибо. Я уже удалил просто месяц
-
да, неверно написал. alter table drop partition '201708' тогда
-
Joined.
-
-
-
да
- 08 September 2017 (121 messages)
-
Привет, а можешь мне подсказать как лучше всего перекинуть данные, с одно сервера, на группу шардов?
-
Привет.
Есть три варианта:
1. С помощью INSERT ... SELECT ... FROM remote(...)
Просто, неэффективно.
2. Если у таблиц совпадает структура - перенести разные партиции на новые серверы. Для ReplicatedMergeTree см. ALTER ... FETCH PARTITION, для обычного MergeTree перенести файлы.
Более сложно, эффективно.
3. Если старые серверы будут присутствовать в кластере в виде шардов, то данные с них можно никуда не переносить. Новые данные писать на другие шарды.
Очень просто, быстро, недостаток - неравномерность нагрузки на кластере. -
-
Есть ли какие то конфиги, которые влияют на параллельность обработки запросов? Столкнулся с ситуацией, что 200-300 запросов в сек уже ложат довольно мощный сервак. Сами запросы в одиночку выполняются в среднем за 0,3 с
-
Ох ) Жестко ) Я такой объем запросов размазываю на кластер ) Для КХ многовато будет 200-300 запросов на один сервер
-
-
как-то странно, мускул справлялся с такой ситуацией вообще легко
-
ожидалось что будет ускорение, а тут совсем сервак ложится
-
Они работают совершенно по разному. КХ предназначен для обработки маленького количества больших запросов
-
Все еще зависит от данных и самих запросов. Мы например агрегируем некоторые данные по данным из КХ. Агрегаторов от 5 до 10 штук. Они делают асинхронные запросы с concurrency 5 и таких процессов висит 25 штук. Но запросы у нас крайне простые. Отдать например значения трех колонок для конкретного пользователя.
-
С такой нагрузкой КХ вполне себе справляется и не было случаев когда запросы убивали сервер. Все запросы валятся в один сервер, но данные размазаны по кластеру.
-
а какого типа данные в базе ?
-
параметры сессии, страница входа, реферер, ip, временные параметры
-
-
^
-
для аналитики идет анализ всех сессий за период, а их мноого)
-
-
да
-
Тут несколько вариантов )
1. Уменьшить количество запросов на один сервер КХ;
2. Сделать кеширующую прослойку;
3. Сделать несколько реплик и балансировать запросы на реплики. -
Я бы выбрал третий вариант в любом случае и размазывал запрос по репликам. Только нужно учитывать replication lag.
-
зачем все делают одно и тоже ?
-
Т.е. может получиться так, что два одновременных запроса на две разные реплики вернут разный результат, а спустя секунду одинаковый - это нормально. Но если это критично, то делать не асинхронную, а синхронную репликацию.
-
Есть еще мысль что лучше сгруппировать похожие запросы и сделать один
-
Потому что много делается фулскана
-
есть какой-нибудь пример?)
-
У нас запросы для аналитики получаются примерно по 300 строк в высоту ) Например на один запрос в API может делаться n+m запросов ) где n - кол-во строк в выборке, m - кол-во метрик на каждую строку из выборки.
-
пока начали 1 и 2 пути
-
Если у вас один шард, то поднимите несколько реплик и можно обычным round robin'om зарулить запросы
-
Я не уверен, но мне кажется, что у нас слишком жирные сервера в кластере, а данных на них не много, поэтому ничего не ложится...пока что :)
-
Например делать не по одному запросу на каждый аккаунт, а сгруппировать их
-
Вместо where accountId= сделать accountId in () и group by accountId
-
У нас кстати так и работает. Причем можно еще указывать конкретные accountId, например если страница с пагинацией и заранее известны идентификаторы accountId.
-
У меня запросы отрабатывают вот как то так. https://img.facedsid.ru/bbv7f.jpg
-
Круто, спасибо, попробуем что то такое применить!)
-
кто-нибудь гугловый DataStudio использует? они открыли доступ к написанию любых коннекторов. я бы мог написать для КХ, но нам DataStudio не нужен.
-
Только у меня судя по запросу не передаются конкретные айдишки, конкретные айдишки кладудтся во временную таблицу и к ним джойнятся данные, этотна случай если по какому то идентификатору вообще нет данных в кх и строка не вылетала из выдачи
-
Всем привет!
Есть n хостов с реплицируемыми табликами, на одной из реплик данных нет и в логах ошибка:
<Error> DB::StorageReplicatedMergeTree::queueTask()::<lambda(DB::StorageReplicatedMergeTree::LogEntryPtr&)>: Poco::Exception. Code: 1000, e.code() = 104, e.displayText() = Connection reset by peer, e.what() = Connection reset by peer
и все, что это может быть? Не подскажите?
Проблема очень рандомная, на тесте ошибка есть, на проде нет. Конфиги одинаковые -
-
Обработать их,заполнив условными дефотлными значениями нельзя ?
-
Joined.
-
Добрый день!
Подскажите, почему не срабатывает функция arrayJoin?
Выполняю такой запрос:
select a.*, arrayJoin(splitByString(',',moid)) as mas_moid from table1 a
Ошибка:
ARRAY JOIN requires array argument
Приводила явно к типу Array - та же ошибка.
К конкретному элементу массива могу обратиться, а применить любую функцию, которая обрабатыет массив - нет. -
Возможно нужно завернуть в подзапрос
-
Попробуйте выполнить запрос без arrayJoin и посчитать кол-во элементов получившегося после splitByString массиов. Может для некоторых строк splitByString возвращает не массив?
-
Зачем. Вот пример из документации
https://clickhouse.yandex/docs/en/functions/array_join.html?highlight=arrayjoin -
Пробовала посчитать количество элементов - подсчитывает правильно
-
Мало ли оптимизатор глючит или еще чего )
-
В подзапрос тоже пробовала ввернуть, аналогичная ошибка
-
Я бы посоветовал убрать лишние колонки, алисы для таблиц и оставить только arrayJoin(splitByString(',',moid))
-
-
в столбце tn такое значение: Nullable(Array(String))
-
-
moid Nullable(String)
-
Имеется ввиду что в таблице есть строки у которых moid = NULL
-
-
нет, у меня сейчас нет таких строк. все moid не пустые
-
а каая у вас версия сервера, у меня другая ошибка отдается
SELECT splitByString(',', moid)
FROM
( SELECT CAST('a' AS Nullable(String)) AS moid)
Received exception from server:
Code: 43. DB::Exception: Received from localhost:9000, ::1. DB::Exception: Nested type Array(String) cannot be inside Nullable type. -
-
может, у кого-нибудь есть идеи, как выкрутиться? пробовала привести к массиву с помощью CAST (может, конечно, сути это не меняет), ошибка та же
-
-
Убрать Nullable, писать пустые массивы и предварительно фильтровать пустые массивы нафиг )
-
Интересный баг, это надо @milovidov_an звать или пилить issue на гитхаб?
-
-
да, так можно посмотреть. у меня, например, вернул 1.1.54245
-
-
с использованием cast(moid as String) работает?
-
Metrics->Overview
-
Cannot convert data from a nullable type to a non-nullable type
-
-
с assumeNotNull заработало
-
спасибо!
-
-
а что будет, если в moid попадется Null? assumeNotNull вернут ошибку и все отвалится или он просто пропустит эту строку?
-
кажется, вот такой вариант должен подойти
SELECT
moid,
if(isNull(moid), emptyArrayString(), splitByString(',', assumeNotNull(moid))) AS x
FROM
(
SELECT CAST('' AS Nullable(String)) AS moid
UNION ALL
SELECT CAST(NULL AS Nullable(String))
)
┌─moid─┬─x────┐
│ │ [''] │
└──────┴──────┘
┌─moid─┬─x──┐
│ \N │ [] │
└──────┴────┘ -
спасибо!
-
Почему при попытке создания таблички на второй реплике получаю такое сообщение - Will not execute task query-0000000068 : There is no a local address in host list.
на первой машинке создается все нормально, на второй нет и получаю отлуп - is executing too long (121 sec.).... -
-
А в limit by нельзя больше одной колонки передать?
-
Разобрался ) Можно )
-
-
😆 Что это было ?
-
А как можно выкинуть из результата строки у которых идет несколько одинаковых значений подряд?
Например. Есть таблица с эвентами и идентификаторами сущности и пользователя.
userId entityId action
1 1 enter
1 1 success
1 1 exit
1 1 success
1 1 success
1 1 success
1 2 enter
1 2 exit
1 2 exit
1 2 exit
2 1 enter
2 1 success
2 1 exit
Что бы в результате осталось
1 1 enter
1 1 success
1 1 exit
1 2 enter
1 2 exit
2 1 enter
2 1 success
2 1 exit -
sequenceMatch не подходит т.к. нужно выбирать колонку с временем, а по ней group by естественно не сделаешь
-
-
Задача немного сложнее :) Есть перед userId колонка с eventTime типа DateTime
-
Да и distinct оставит только один эвент, у меня например у пользователя 1 может быть несколько последовательностей типа enter, success, exit на одну сущность
-
Я так понял, что никак :)
-
-
Не получится, есть колонка с временем по которой group by не сделаешь
-
-
результат получиться идентичен результату без group by
-
-
any(time) тоже не подойдет, т.е. будет случайное число, а мне нужно точное время
-
-
Просто есть последовательность событий и из них нужно строить например сессии
-
И логика такая, что сессия - это наличие enter + (success || exit)
-
И так, то бы между ними не было дырки больше чем 30 минут
-
И исключать например 30 подряд идущих enter событий
-
Помимо времени выбирается еще несколько колонок )
-
-
Вобщем то я понял, что лучше на клиенте это дело обработать и выкинуть лишние данные
-
Тут вопрос именно в том, что бы выкидывать битые последовательности. Например часть данных не поступила и у пользователя идет 100 enter в сущность подряд. Такие вещи нужно выкидывать. Сессия считается полной только в случае наличия двух событий из возможных трех событий.
-
Тут получается окно, а с окнами в CH пока никак
-
-
Блин ) Таблица так то 850кк )
-
-
-
Ладно, попробую сейчас джоин, предварительно фильтруя по какому либо признаку )
-
-
-
выглядит как groupArray(time),groupArray(action) и потом некоторые (вероятно не поддерживаемые CH) пляски на массивах.
-
Я такое считала, выглядит примерно так:
SELECT
groupArray(EventName) as events,
groupArray(Time) as times,
arrayEnumerate(events) as events_index,
arrayFilter(name, index -> (index = 1) OR (events[index] != events[index - 1]), events, events_index) as events_filt,
arrayFilter(time, index -> (index = 1) OR (events[index] != events[index - 1]), times, events_index) as times_filt
FROM (
SELECT * FROM mytable ORDER BY time
) -
Вот вобщем то пример
-
-
Это вот данные по одной сущности
-
И нужно оставить то, что в прямоугольниках, остальное выкинуть, т.к. не соблюдается последовательность
-
-
Эх ) Досадный баг с limit n by )
-
Я Алексею уже писал про него
-
Придется чуть больше данных джоинить
-
#faq
-
force_index_by_date - проверяет, есть ли в запросе условие на ключ даты, которое может использоваться для отсечения партиций.
force_primary_key - проверяет, есть ли в запросе условие на первичный ключ, которое может использоваться для отсечения диапазонов первичного ключа.
Если соответствующая настройка выставлена в 1, а подходящего условия нет - кидается исключение.
При этом не проверяется, действительно ли условие уменьшает объём данных для чтения. Например, условие на дату Date != '2000-01-01' считается подходящим при выставленной настройке force_index_by_date, даже когда в таблице все данные подходят под это условие и для выполнения запроса требуется full scan. - 09 September 2017 (37 messages)
-
У меня тут такая проблема, помогите понять в чем причина.
Права на папку detached 777 рекурсивно.
Выполняю такой запрос:
ALTER TABLE bd.table
ATTACH PARTITION '201709'
Received exception from server:
Code: 1000. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Access to file denied: insufficient permissions: /var/lib/clickhouse/data/db/table/detached/20170902_20170906_1_154781_12691. -
-
Привет, клиент go. В таблице 10м значений. Код то выполняется то нет (будто нет данных). Без ошибок
iter := clickhouse.NewQuery(
sql, args...,
).Iter(clickHoustClient)
for iter.Scan(&ip, &dateAt) {
// agg
}
return iter.Error()
Запрос тупо селект по всем данным в таблице
Проблема в том что запрос то выполняется, то не выполняется если вызвать его. То есть код отрабатывает мгновенно и без ошибок будто таблица пустая. А бывает что все в порядке возвращает данные и итератор бежит по всем данным. На транспорте стоит timeoyt=60sec
В чем может быть проблема? -
клиент го это в другую сторону )
-
я юзаю тот же клиент, в данный момент
-
-
-
-
не понял?
-
я про то, что здесь не гошный чат ) если запрос выполняется — значит все ок, не к кликхаусу вопрос 😄
-
имхо
-
как выше верно подметили, это какая-то проблема с транспортом. попробуй спросить у гоферов
-
-
-
у меня подобных проблем не было, во всяком случае )
-
-
-
-
Подскажите плиз по дизайну витрин. Что эффективнее — одна мега-широкая таблица в которой вперемешку лежат метрики и атрибуты или же относительно узкая таблица фактов с метриками и ключами, окруженная словарями?
-
Аналитикам понятное дело удобнее читать данные из одной широкой таблицы.
-
-
-
Да вот именно посмотрел и в ужас пришел
Сменил клиента и порядок -
а чем метрики и атрибуты отличаются от метрик и ключей?
-
ключи — маленькие целые, а атрибуты — длинные текстовые
-
согласен, для изменяющихся атрибутов лучше использовать словари, а если атрибуты не меняются?
-
с ключи обычно занимают меньше места, поэтому запрос работает быстрее, и, как уже сказали, данные в словаре можно апдейтить.
но при этом запрос становится а) непонятнее (id=7500) б) длиннее (select id,getDictString(...id)), если писать их руками это менее удобно. -
Мне подозревается что тут у каждого второго написан конструктор запросов
-
Это точно. Запросы в 300 строк в высоту руками писать как то тяжеловато
-
А есть там выбор данных из словаря или нет вообще не усложняет запрос )
-
Нет никакой проблемы в широкую таблицу положить огромную строку
-
Но если хочется с ними что-то делать, то рядом со строкой обязательно класть хеш типа cityhash
-
Это может на порядок ускорить запрос
-
Joined.
-
спасибо
-
У меня тут такая проблема, помогите понять в чем причина.
Права на папку detached 777 рекурсивно.
Выполняю такой запрос:
ALTER TABLE bd.table
ATTACH PARTITION '201709'
Received exception from server:
Code: 1000. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Access to file denied: insufficient permissions: /var/lib/clickhouse/data/db/table/detached/20170902_20170906_1_154781_12691. -
- 10 September 2017 (54 messages)
-
Проверте владедьца папок, это должен быть clickhouse
-
-
-
-
Описанный эффект, значит цпу который ажура даёт не поддерживает sse4.2
-
-
-
С мелкими хостерами на квмах помогает бодаться с поддержкой.
-
-
-
-
-
-
-
-
-
-
-
Хипер-в же
-
-
-
Выберите другую машину. У меня в Azure поднят КХ и все ок.
-
вот интересно, как они пофиксили 10к коннектов на hyper-v для ажура
-
-
А какая у тебя модель?
-
Спроси у саппорта :)
-
Ща спрошу, сам не знаю точно)
-
Он там изначально как опция
-
Буду признателен, там их 100500 видов :)
-
Админ спит, так что сказать не могу точно. По характеристикам это 4 ядра и 8 гигов и Debian.
-
Более точно :)
Standard F4s (4 vcpus, 8 GB memory) -
-
Всем привет, а есть в КХ функция, которые объединяет два массива в один?
что-то типо union, например для
SELECT arrayUnion([1, 2, 3], [4, 5, 6]) AS res
вернула бы [1, 2, 3, 4, 5, 6] -
-
такого
-
SELECT arrayReduce('groupArrayArray', [[1, 2, 3], [10, 20, 30]])
сработало
вопрос закрыт -
Joined.
-
Joined.
-
Как заклинание прозвучало :)
-
-
пока что так и есть, скоро будет менее хакерская функция.
-
А есть ли способ сгруппировать не только одинаковые массивы, но группировать массив и с теми что полностью в него входят, например:
action | categories
1 | [1,2,3,4,5]
1 | [2,3]
2 | [1,2]
2 | [2,3]
сгруппировать
SELECT action, fn(categories) AS cat, COUNT() AS cnt FROM t GROUP BY action, cat
и получить
1, [1,2,3,4,5], 2
2, [1,2], 1
2, [2,3], 1
? -
-
-
-
если я правильно вас понял, то вы хотите примерно вот что. у вас есть некоторое подмножество X какого-то powerset P, и вы хотите найти в нем Xmax = {x \in X| !\E a: x \subset a }, т.е. множество "максимальных" элементов X, и потом каждый элемент округлять до максимального. во-первых у вас проблема с неоднозначностью, а во-вторых, на уровне исполнения запроса это преобразование не функция отдельной строки.
-
а если есть [A], [B] и [] ?
-
-
-
-
Joined.
-
Joined.
-
Здравствуйте ,как победили баг? у меня абсолютно аналогичная ситуация, понять не могу откуда ноги растут Code: 49, e.displayText() = DB::Exception: Unknown element 'umts' for type Enum8('noservice' = 1, 'gsm' = 2, 'umts' = 3, 'lte_fdd' = 4, 'lte_tdd' = 5), e.what() = DB::Exception
-
В ближайшем релизе появится нормальная операция конкатенации массивов и не только.
- 11 September 2017 (66 messages)
-
Можете уточнить, когда ожидается и в какой мере более полная поддержка JOIN? Тут https://clickhouse.yandex/docs/en/roadmap.html достаточно размыто написано
-
-
Вот запрос из доки
http://joxi.ru/RmzNOePtWOkvPm
(примерно тут https://clickhouse.yandex/docs/ru/query_language/queries.html#id9)
Что он делает, прям по UserId агрегирует что ли?1505119111642 (167 kb) uploaded September 11, 2017 Joximade using Joxi.net
-
Я так полагаю, что это было бы аналогично, если было бы написано avgIf или where userId IN
-
Похоже, но вопрос в том, а по какому полю считается avg?
-
А, видимо считается доля строк по каждому userId, хотя могу ошибаться
-
Хотя avg все таки считает среднее
-
Ну да ) Там написано "за каждый день после 17 марта считаем долю хитов, сделанных посетителями, которые заходили на сайт 17 марта"
-
Добрый день. Помогите советом. Есть задача "обновлять" имеющиеся записи в КХ (да, знаю, что апдейтов нет)
Есть таблица пользователей. У каждого есть уникальный айди и много атрибутов
В момент добавления записи не все атрибуты могут быть известны. По мере поступления новых данных атрибуты надо обновлять
Есть работающее решение - просто инсертить новые записи, а каждый атрибут вычислять через argMax (у каждой записи есть таймстемп) группируя по user_id. Оно работает, но не очень быстро. Пользователей не очень много (сейчас около 3 миллионов, но число будет расти). Нужны они в КХ т.к. хотим по атрибутом пользователя фильтровать события (джоинить таблицы юзером в ивентов).
Есть ли варианты лучше?
Еще были мысли сделать "юзеров" сделать через словарь (в mysql например) не будет ли их количество проблемой? -
-
-
Можно попробовать инкрементальный лог и CollapsingMergeTree - https://clickhouse.yandex/docs/en/table_engines/collapsingmergetree.html
-
У нас похожая схема используется. Только мы используем ReplacingMergeTree и пишем данные сразу по всем колонкам. Они пересчитываются после получения новых эвентов о пользователе (посчитать, сагрегировать и пр. в КХ невозможно из-за особенностей бизнес-логики). Через словарь в КХ пробовал, но проблема словаря в том, что например на 250к строк есть определенный лаг, т.к. КХ почему то на каждый запрос лезет в MySQL и проверяет актуальность ключей (возможно я ошибаюсь и он берет из кеша, но все равно как то долго), поэтому вариант с MySQL у нас отвалился.
-
Лучше хранить где то старое состояние, например в redis, после вычисления новых данные, брать старое состояние, обновлять его и писать в КХ
-
Это будет куда быстрее, чем считать argMax
-
-
-
-
-
-
Joined.
-
-
все верно
-
-
-
-
Добрый день. Настраиваю работу 2 шардов по 2 реплики. Странное поведение: делаю вставки в distributed таблицу на 1-ом сервере, часть данных уходит на 4-ый (шардирование работает нормально), но не все данные попдают на сервер 3 с 4-го (реплики) и ничего не пишется на 2-ой (реплика первого)
-
в логах ReshardingWorker: no node, path: /clickhouse/task_queue/resharding/clickhouse1
-
CREATE TABLE video
(
...
) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/video', '{replica}', EventDate, cityHash64(URL), 8192);
CREATE TABLE video_distributed AS video ENGINE = Distributed(statistics, default, video, cityHash64(domainWithoutWWW(URL))); -
в конфигах
<macros incl="macros">
<shard>1</shard>
<replica>clickhouse1-1</replica>
</macros>
<macros incl="macros">
<shard>1</shard>
<replica>clickhouse1-2</replica>
</macros>
<macros incl="macros">
<shard>2</shard>
<replica>clickhouse2-1</replica>
</macros>
<macros incl="macros">
<shard>2</shard>
<replica>clickhouse2-2</replica>
</macros> -
В Q4. Можно будет делать JOIN-ы без необходимости оборачивания всего в подзапросы и с обычным синтаксисом.
-
-
Минимальной датой в DateTime тоже является 1970-01-01 как в Date ?
-
Добрый день, подскажите пожалуйста по внешнему словарю.
complex_key_cache смотрит в постгрес. Когда не находит записи по ключу, то кидает "RecordSet contains 0 columns while 5 expected", а в постгресе вижу висит запрост PREPARE ... с этим ключем.
Вопрос примерно: почему иногда он умеет доставать несуществующую запись и заполнять дефолтными значениями, а иногда отваливается? -
Спасибо за ответ. А стоит ожидать появление этого функционала до конца года? Или Q4 - дата начала разработки?
-
-
Есть дата и время, например 2017-09-11 14:44:01, ее как то функциями для работы с датами можно преобразовать в 2017-09-11 23:59:59? )
-
А зачем преобразовывать? Что хотите дальше с такой датой делать?
-
Мне нужно собрать общую продолжительность эвентов с группировкой по дням. Есть дата начала эвента и дата завершения эвента. Если эвент растянулся на пару дней, то нужно за эти несколько дней на каждый день посчитать продолжительность.
-
Можно проецировать на визиты. Есть время визита, например визит длился 15 минут. Начался визит 2017-09-10 23:55:00 а кончился 2017-09-11 00:10:00. И вот результат запроса должен быть типа
2017-09-10 - 300
2017-09-11 - 600 -
Хм, хотя я могу использовать timeSlots
-
Joined.
-
Округлить до даты можно так:
1. toDate(date)
2. substring(date, 1, 10)
А что такое 300 и 600 в примере? Продолжительнось в секундах? -
Да
-
Мне не округлить до даты нужно ) Мне нужно зная дату поставить ей время в 23.59.59 )
-
-
Хотя это костыль. Сейчас попробую через timeSolts попробовать
-
Блин, точно....забыл про них совсем! Сори, что дернул глупым вопросом!
-
А нормально делать представление у реплицируемой таблицы тоже реплицированным? Синхронизация от этого не поломается?
-
-
-
Вобщем разобрался )
Если кому будет интересно как например растянуть эвент и посчитать время эвента по дням, учитывая время начала и время окончания эвента, то можно вот так)
SELECT toDate(started) + days as date,
if (started > toStartOfDay(toDateTime(date)), started, toStartOfDay(toDateTime(date))) as dateStarted,
if (toStartOfDay(toDateTime(date)) + 86399 > ended, ended, toStartOfDay(toDateTime(date)) + 86399) as dateEnded,
started as oStarted,
ended as oEnded,
if (toDate(oStarted) != toDate(dateEnded), dateEnded - dateStarted + 1, dateEnded - dateStarted) as dateDuration
FROM
(
SELECT
toDateTime('2017-09-09 23:55:00') AS started,
toDateTime('2017-09-12 14:00:00') AS ended,
range(toUInt8(if(toDate(started) != toDate(ended), (toDate(ended) - toDate(started)) + 1, 1))) AS days,
223500 as duration
)
ARRAY JOIN days -
В финале должно получиться что-то вроде https://img.facedsid.ru/f2brp.jpg
-
Joined.
-
-
Для истории - в конфиге были напутаны номера портов в <replica>
-
Привет всем, как импортитровать пустую строку из csv? Там в таком виде data,,,data, как бы два столбца пустые
-
А как вы пробуете импортировать?
-
cat file.csv | clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV";
-
И что пишет, когда выполняете эту команду?
-
Все нормально, со структроро не совпадало, спасибо
-
Добрый вечер. Наткнулся на непонятное поведение Enum.
:) select * from Order where Rebill='yes';
SELECT *
FROM Order
WHERE Rebill = 'yes'
Received exception from server:
Code: 49. DB::Exception: Received from localhost:9000, 127.0.0.1. DB::Exception: Unknown element 'yes' for type Enum8('no' = 0, 'yes' = 1).
0 rows in set. Elapsed: 0.068 sec.
:) select Rebill,Count(*) from Order group by Rebill;
SELECT
Rebill,
Count(*)
FROM Order
GROUP BY Rebill
┌─Rebill─┬─Count()─┐
│ no │ 390136 │
│ yes │ 302973 │
└────────┴─────────┘
2 rows in set. Elapsed: 0.011 sec. Processed 693.11 thousand rows, 693.11 KB (61.00 million rows/s., 61.00 MB/s.)
Что может быть? -
Уже были предложения не так давно про непечатные символы
-
-
-
у меня подобная проблема и она не решилась, у меня эта бага вылетает во время инсерта через infi.clickhouse_orm, причем баг мигающий какой-то
- 12 September 2017 (207 messages)
-
Всем привет! Если есть народ использующий в работе Microsoft PowerBI - создал голосвание на добавление коннектора к КХ: https://ideas.powerbi.com/forums/265200-power-bi-ideas/suggestions/31355041-add-connector-to-clickhouse
p.s. если сами не используете, но знаете аналитиков которые используют - тоже киньте им ссылочку на голосование =)Add connector to ClickHouseClickHouse is an open source column-oriented database management system capable of real time generation of analytical data reports using SQL queries. https://clickhouse.yandex/
-
-
Интересует по опыту, допустим, нет агрегаций в запросах и не планируется. Имеет ли смысл для репликации во избежание проблем со статическим dns использовать кафку а у подписчика будет простой инстанс КХ уже без репликаций. ( если рассмотреть для начала схему совсем утрированно, то льем данные на 2 сервера, а забираем с одного )
-
@milovidov_an спасибо за odbc драйвер
-
-
Рассмотрим по порядку имя первого куска: 20140317_20140323_2_2_0.
20140317 - минимальная дата данных куска
20140323 - максимальная дата данных куска
2 - минимальный номер блока данных
2 - максимальный номер блока данных
0 - уровень куска - глубина дерева слияний, которыми он образован
(из доки) -
А как clickhouse-client хранит историю запросов? Мне нужно из истории выдрать запрос :) Есть возможность как то локально прошерстить историю?
-
просмотрел, спасибо!
-
В файле ~/.clickhouse-client-history
-
Супер! Спасибо! Пойду шерстить
-
Нашел все что нужно! Спасибо еще раз
-
Представим, что есть select ... where <условие1>. Мне нужно выполнить сразу 500 подобных запросов. Что кликхаусу не рекомендуется. Но в целом select ... where <условие1> or <условие2> ... <условие 500> меня устроит. Только я вот думаю, так нормально или этим способом КХ не обмануть.
-
-
-
-
-
Смотря какие условия. Если там условия из серии where userId = 1 or userId = 2 or userId = 3, то можно временную таблицу использовать
-
-
Не понял для чего временная таблица то нужна?
-
Что бы в запрос не толкать 500 where userId = N
-
А сделать where user id in temp_table
-
Не. У меня <= в основном.
-
из документации:
Большинство операций с числами и со строками не имеет смысла и не работают для Enum-ов: например, к Enum-у нельзя прибавить число. Для Enum-а естественным образом определяется функция toString, которая возвращает его строковое значение.
кажется, что все верно, и нужно использовать toString -
А зачем делать 500 запросов за раз?
-
Вопрос больше не в том зачем ( мне 500 or условий даже лучше ), а как с точки зрения разработчиков субд это может повлиять на производительность, ибо для сотен запросов в секунду база не предназначена, а ситуация с or условиями весьма похожа на отдельные запросы.
-
Я делал один запрос с достаточно большим WHERE, порядка нескольких тысяч условий (OR и AND). Работало медлено, но всё равно сильно быстрее чем несколько сотен отдельных запросов
-
-
Не факт. Смотря сколько блоков данных прочитается. Они всегда могут быть в случайном порядке, но внутри блока должны быть отсортированы по ключу, да.
-
Я с таким сталкивался уже
-
Когда из большой таблицы выбирал данные и например КХ читал несколько блоков данных и данные всегда были вперемешку
-
Возможно это применительно только к чтению из Distributed таблиц
-
На локальных таблицах не проверял
-
Подскажите, пожалуйста, два шарда по две реплики. Очень редко, но бывает "part *** is lost forever". Посмотрел комментарии в исходниках. Сеть не падала, сервер не выключался и тому подобное.
Интересует дальнейший механизм. Скажем, сервер написал "lost forever", допустим part-данных удалилась с реплики. Происходит какая-то проверка в дальнейшем, которая автоматически (средствами КХ) определит расхождение в данных на репликах шарда и восстановит "утраченное"? Или нужно что-то придумывать после того, как увидел подобную ошибку в логах? -
-
Да, спасибо, еще раз посмотрел, но сервер продолжает работать штатно, проблем в зукипере не наблюдается, detached - пустая.
Можно ли считать обнадеживающим в этом случае (циатата из мана) "Если имеются небольшие несоответствия, то система устраняет их, синхронизируя данные с реплик" ? -
Вообще должно работать автоматически, да. Где то в чатике поднимали вопрос о том как принудительно синхронизироваться с другой репликой. Нужно поискать
-
еще раз спасибо, поищу
-
опытным путем установил что на локальных тоже так. спасибо
-
-
Что за ошибка Expected end of line это в конце файла не хватает _eof или в конце строки?
-
-
через head вывел первые строки, переносятся строки
-
-
-
ну —data-binary это curl'a фишка
-
-
Joined.
-
Я согласен что операции не имеют смысла, речь идет о сравнении на идентичность. Тут обратная операция - из строки приводится в число соответстующее значению Enum.
-
У меня такое было когда я пихал на инсерт зажатый файл, а заголовок о том, что он зажат не передавал
-
Да не у меня просто csv
-
А формат входных данных точно указан как CSV?
-
Да
-
Я через head 1 строку заимпортил нормально
-
-
-
-
-
Я питон толком не знаю, так что если сделаете -- отлично 🙂
-
День добрый!
Мощно инсертим в клик, и наблюдаем следующую картину:
Load average высокий, а общее потребление не очень высокое.
В htop вижу попеременно BackgrProcPool и ParalInputProc.
С какими настройками поиграться, чтобы LA отбросить? Тюнятся размеры этих пулов? -
-
-
-
Линукс, iowait меньше процента
-
В iops тоже не упираемся (ssd)
-
а сеть ?)
-
Да, 500 условий лучше, чем 500 запросов.
Будет работать быстрее хотя бы потому, что данные читаются за один проход. -
5 mb/s )
-
Хорошо, что сейчас удаётся пользоваться. Последние несколько месяцев разработкой драйвера целиком занимается Павел https://github.com/artpaulartpaul - Overview
artpaul has 6 repositories available. Follow their code on GitHub.
-
На Hyper-Threading CPU, загрузка половины логических процессорных ядер (отображается в вашем инструменте как 50%) фактически обозначает полное использование CPU.
-
Расхождения между репликами устраняются. Но part is lost forever говорит о том, что некоторого куска не будет на всех репликах и достать его неоткуда.
-
оу, вот это печально, но благодаю за пояснение
-
Это говорит о том, что вернулся не пустой resultset, а что вообще ничего не вернулось. Я недостаточно знаю Postgres, чтобы понять, почему так происходит.
-
DROP PARTITION удаляет партицию из рабочего набора. Но в течение 8 минут она остаётся на файловой системе и в списке не active parts. После этого времени удаляется окончательно.
-
В Ла входит много чего. Процессы в D state например. Вообще не надо только на Ла ориентироваться
-
А язык будет английский или немецкий?
-
На английском.
-
Так что приходите и приглашайте коллег, кому будет удобно!
-
-
А там ведь недалеко и должны быть дешёвые билеты.
-
-
И конечно имеет смысл пригласить коллег. Можно хотя бы одного человека отправить вместо делегации :)
-
-
Как правило за неделю можно сделать.
-
-
В UK нужна виза если ты по работе в ЕС и наоборот, нужен Шенген если ты работаешь в UK. Только гражданам ес хорошо
-
Рано ж еще
-
-
-
-
У меня стоит пункт, что надо податься. Ещё ничего не продумал и не смотрел. Спасибо, что напомнили про CFP. А то в прошлый раз было довольно грустно - огромная толпа народа, а возможности по-нормальному рассказать нет.
-
-
-
-
Fosdem - 13 October deadline
-
-
-
-
20 сентября - это что? Чтобы сказать - я буду делать свой devroom или чтобы вписаться в существующий?
-
До 20 сентября можно организовать деврум
-
-
Скорее всего это не вариант для нас.
-
Вы я думаю в традиционный db devroom впишитесь
-
-
-
Надо посмотреть. А это сейчас надо делать или подождать?
-
-
Лучше подайтесь в мейн, да
-
-
Мониторинг мне в прошлом году поправился
-
-
Там как повезет, да
-
-
-
-
-
-
-
-
-
-
-
-
-
Это такая взятка обычно
-
-
-
-
-
-
-
-
-
-
Я не в Яндексе
-
-
эт да
-
Конфа дороже 800 за билет - очень вероятно развод
-
-
для того чтобы поддерживать статус партнёра обязаловка на них бывать
-
-
-
-
-
-
-
Там разные. Srecon вот нет
-
Он в целом выше уровнем
-
-
-
Фосдем? Он разный
-
-
-
-
-
-
Угу мой доклад про графит пока там лучше всего зашел
-
-
-
-
Да вот фиг ты ее узнаешь заранее
-
А запись есть?
-
-
-
Да, нашел
-
-
Интересно, что они в ядре с этим работают
-
-
-
-
-
-
-
-
-
Скорее обработка трафика и около ddos
-
привет, а можно без сильных исхищрений получить порядковый номер строки в резалтсете с учетом агрегаций и лимитов? чтобы, например, запрос
select rank(), report_date, domain, sum(visits) as visits from dbreports.rank_all group by domain,report_date order by visits desc limit 5,5
содержал столбец rank со значениями 5..10? -
Спасибо. Но тогда ещё вопрос. Если я в where с оптимизирую or / and / скобочки, можно ли предплагать, что для or если первое выражение true, то дальше считать не будет ( и тоже самое для and/false) , не нашел в доке.
-
-
То есть оптимизировать и не стоит
-
Да, можно. SELECT rowNumberInAllBlocks(), * FROM (your query)
-
смотря что вы имеете в виду. если вы статически можете упростить выражение перед отправлением его в запрос, так что оно станет меньше и будет выполняться быстрее, то почему бы и нет.
-
да, похоже, что работает, спасибо, только пришлось вынести limit за скобки
SELECT rowNumberInAllBlocks(), * FROM (select domain from dbreports.rank_all where report_date='2017-07-01' group by domain,report_date order by sum(visits) desc) limit 5,5 -
Ясно. Было бы здорово конечно иметь возможность забиндить свою сишную функцию для where. Она никогда не пригодится остальному миру, а форкать и пересобирать КХ не охота.
-
а планируется http://repo.yandex.ru/clickhouse/ для yaketty/zesty? на убунту 17.04 не ставится из репозитория
-
через докер запускай ))
-
-
да, меня просто насторожило что для нее пакетов и не появилось
-
LTS наше все?
-
-
-
👍🏻
-
-
-
-
В русской более актуальна.
-
-
Да, можно любые вопросы задавать.
Про пакеты для RHEL - мы говорили, что они сделаны внешними людьми.
Находятся здесь: https://github.com/Altinity/clickhouse-rpm-install
А в документацию забыли добавить.GitHub - Altinity/clickhouse-rpm-install: How to install clickhouse RPM packagesHow to install clickhouse RPM packages. Contribute to Altinity/clickhouse-rpm-install development by creating an account on GitHub.
-
дико плюсану этот моментище. Из-за этого на сыром метале невозможно поставить R и clickhouse-client на одной машинке
-
-
Насколько я помню, макросы просто не обновляются без перезагрузки.
-
Очень мало частей конфигурации вступает в силу без перезагрузки: всё что в users.xml, все dictionaries и remote_servers.
-
Прошу прощения за глупый вопрос. Кто использовал infi.clickhouse_orm для импорта данных в CH, как наиболее эффективно заполнять поля для сконфигурированных классов таблиц ? Я формирую pandas DataFrame размером один батч с данными из имеющейся базы, заполняю где был null стандартными значениями, проверяю приведение и начинаю формировать объекты для каждой строки через .setattr(x, value). занимает это порядка 3с на 1000 объектов с 122 полями. Мб возможно оптимизировать работу через другие коннекторы ? Спасибо.
-
Понял, спасибо!
-
Я могу только заметить, что это действительно очень медленно. Но я сам не пользовался этим драйвером и не могу сказать, что тормозит - драйвер или Pandas.
-
Pandas выполняет все свои проверки быстро и над всеми полями. Меня в силу недостатка знаний смущает конструкция последовательного прохода по всем 122 параметрам для каждого из 1000 объектов.
-
Доброй ночи. Ребят подскадите есть ли чат по API отчетов v1 для AppMetrica? Интересует, можно ли группировать не только по трекерам, но и по меткам, которые используются в этих трекерах.
-
Попробуйте наш нативный драйвер https://github.com/mymarilyn/clickhouse-driver
Есть обёртка для sqlalchemy https://github.com/xzkostyan/clickhouse-sqlalchemyGitHub - mymarilyn/clickhouse-driver: ClickHouse Python Driver with native interface supportClickHouse Python Driver with native interface support - GitHub - mymarilyn/clickhouse-driver: ClickHouse Python Driver with native interface support
- 13 September 2017 (83 messages)
-
GitHub - mymarilyn/clickhouse-driver: ClickHouse Python Driver with native interface support
ClickHouse Python Driver with native interface support - GitHub - mymarilyn/clickhouse-driver: ClickHouse Python Driver with native interface support
-
-
А в вашей обертке для алхимии есть поддержка функций с лямбдами?
-
-
Функций в плане прокси в виде func.do_smth()? Можно пример того что хочется?
-
например, я хочу использовать какую-нибудь функцию работы с массивами, где есть лямбда:
SELECT arrayFilter(x -> x LIKE '%World%', ['Hello', 'abc World']) AS res -
-
спасибо, посмотрю
-
-
-
-
А почему при записи 1970-01-01 в колонку типа Date я получаю 0000-00-00 вместо 1970-01-01? )
-
а зачем вообще писать такую дату?
-
Зачем вообще писать дату? )
-
Есть например справочник всех войн и там куча показателей
-
И например дата войны до юниксовой эпохи
-
Это просто как пример привязки даты к событию
-
Таких кейсов может быть много
-
тогда пиши строку, а не дату
-
-
-
...
-
да, верно
-
-
Как вариант, только никакие операции не произведешь. Например среднюю продолжительность мирного времени не посчитаешь ) бред сумасшедшего, но все же )
-
-
-
работайте со сдвигом на 2000 лет )
-
Инт без сдвига нет смысла использовать. 0 значение будет первое января 1970 года, а мне надо раньше ) вот и получается, что нужно двигать, да
-
Причем сдвиг в 2000 лет должен учитывать високосные года )
-
-
Есть такой запрос (из Табло)
SELECT Custom_SQL_Query.date AS date, SUM((CASE WHEN Custom_SQL_Query.uv = 0 THEN NULL ELSE CAST(Custom_SQL_Query.vv AS FLOAT) / Custom_SQL_Query.uv END)) AS sum_vv__copy__ok FROM ( SELECT subsite_id, subsite, date, percent_view ) Custom_SQL_Query WHERE (Custom_SQL_Query.subsite IN ('Gambit', 'Gambit-html5-android', 'Gambit-html5-ios')) GROUP BY date
КХ возвращает Internal error
вот кусок лога https://pastebin.com/78ShXb0J -
-
А зачем в CASE выполнять преобразование cast(count() as Float?
-
-
-
-
Возможно дело в том, что в КХ NULL добавлен относительно недавно, и что-то ещё не до конца поддерживает NULL.
На это указывает, что замена на явное указание 0 работает -
-
splitByChar не пйодет?
-
-
-
Ну кстати у меня вот снова проблема повторилась и снова с отрицательным Enum-ом. Не понимаю пока в чем дело и как лечить.
Есть две таблицы, в них объявлен один и тот же Enum, но одна позволяет селектить по условию EnumName='UNKNOWN' а другая не повзоляет, требуется кастовать. -
Схему таблиц укажите
-
причем, что еще интереснее, в Enum'е 3 значения: Enum8('UNKNOWN' = -1, 'FALSE' = 0, 'TRUE' = 1)
Вот эти два валятся с ошибками:
select * from test.virtual_status_2017_02_26 WHERE ParentalControlEnabled='UNKNOWN' limit 1
select * from test.virtual_status_2017_02_26 WHERE ParentalControlEnabled='TRUE' limit 1
А вот этот отрабатывает:
select * from test.virtual_status_2017_02_26 WHERE ParentalControlEnabled='FALSE' limit 1 -
В смысле показать здесь структуру проблемных таблиц?
-
Да
-
Field1 String
Field2 Enum8(\'UNKNOWN\' = 0, \'WINDOWS\' = 1, \'ANDROID\' = 2)
Field3 DateTime
Field4 FixedString(16)
Field5 Nullable(String)
Field6 Nullable(String)
Field7 Nullable(String)
Field8 DateTime
Field9 Enum8(\'V1\' = 1, \'V2\' = 2, \'V3\' = 3, \'V4\' = 4, \'V5\' = 5)
Field10 Nullable(String)
Field11 UInt32
Field12 FixedString(2)
Field13 UInt32
Field14 String
Field15 Enum8(\'UNKNOWN\' = -1, \'FALSE\' = 0, \'TRUE\' = 1)
SendAnonStats Enum8(\'UNKNOWN\' = -1, \'FALSE\' = 0, \'TRUE\' = 1)
ParentalControlEnabled Enum8(\'UNKNOWN\' = -1, \'FALSE\' = 0, \'TRUE\' = 1)
Field16 Enum8(\'UNKNOWN\' = 0, \'EXPIRED\' = 1)
Field17 Nullable(UInt32)
Field18 Array(String)
Field19 Array(String)
Field20 Array(UInt32)
Field21 Enum8(\'UNKNOWN\' = 0, \'EXPIRED\' = 1, \'FREE\' = 2) -
-
-
-
А для поля Field2 работает нормально? Может дело в том, что в проблемных полях есть значения с -1?
-
-
-
-
-
Судя по описанию доки
https://clickhouse.yandex/docs/ru/data_types/enum.html?highlight=enum
лично у меня сомнение, что если указать отрицательное значение, оно в какой-то ситуации может пытаться кастоваться как Int8. Что и проводит к ошибке -
а можете приготовить готовый минимальный тест в котором будет видно что падает ?
-
-
То есть вместо Enum'a оно где то кастуется как Int8?
-
Это предположение
-
-
-
-
-
Всем привет!
Сегодня столкнулся с очень неприятной ситуацией.
Есть кластер из 4 шардов и у каждого шарда по реплике.
Внезапно на одном из шардов во всех запросах к таблице с ограничением по дате (например WHERE d_event_date=today()) сервер начал процессить все строки за все дни в партиции за текущий месяц. В итоге получилось, что на трех шардах запрос для обработки использует 50 миллионов строк, а на одно четвертом 1,2 миллиарда (что составляем количество строк за весь сентябрь). Та же ситуация и на реплике этого шарда.
Единственный вариант - пересоздавать таблицы и перегонять данные, но это очень больно (
Никто не сталкивался с такой проблемой у себя? -
-
Друзья, как очистить таблицу с репликацией?
-
-
-
-
Joined.
-
А будут? Вроде бы дело запланировано
-
Джоины начали поддерживать условия? оО
-
Или там только равенство?
-
Добрый день,
подскажите плиз, работает ли в данный момент решардинг?
Как только не пытался его завести, получаю
Code: 325. DB::Exception: Received from localhost:9000, ::1. DB::Exception: This host is not allowed to subscribe to coordinator coordinator-0000000008.
Задача - расширить кластер новыми шардами. Может быть есть еще какой-то способ. Сдампить, расширить, залить в новое не подойдет, объем данных уже большой. -
Только равенство, причем колонки должны называться одинаково
-
Joined.
-
Коллеги, привет!
На RIW 2017 ищу рекламодателя, который может поделиться опытом использования clickhouse. -
Есть тут такие?)
-
А, тогда ничего нового ) думал пропустил что-то важное )
-
Решардинг сейчас не поддерживается.
-
Joined.
- 14 September 2017 (99 messages)
-
Есть, но из Украины:)
-
А что за клиент?
-
А не подкажете какой-нибудь способ _на живую_ увеличить количество шардов в кластере? Хотелось бы конечно еще и данные не протерять при этом :)
-
Вопрос не про КХ, а про табикс. Может быть, у кого-то есть опыт
-
Кто-нибудь знает, с чем связано ограничение tabix на Not readonly CH user? И можно ли это как-то обойти?
Конечно, там поддерживается readonly = 2, но это позволяет сделать SET profile = 'blah-blah' и обойти ограничения, которые хотелось поставить на юзеров табикса -
Мы делали по-простому: создавали аналогичные таблицы заново на всех шардах, меняли distributed-таблицу, куда инсертили данные. старые данные перелили через insert into ... select * from ... Можно по партициям это делать, если с местом плохо.
-
Спасибо, я думаю создать новый кластер поверх дополнительного оборудования и также копией таблиц.
-
При каждом запросе я посылаю add_http_cors_header=1&log_queries=1
-
а что это дает? в дев тулз браузера я тоже вижу у нас эти параметры при запросах
-
add_http_cors_header - без этого не работает tabix - это подставляет доп заголовки CORS
log_queries - всегда логировать запросы в system.querys -
после обновления clickhouse-client падает с
Poco::Exception: Exception: Cannot load time zone W-SU
где править конфиг?
Ubuntu 12.04.5 LTS -
Я хотел сделать настройку user_is_readonly - типа галка при подключении
Но возможно в будующих версиях эти параметры изменяться, уже есть такие
- send_progress_in_http_headers
- http_headers_progress_interval_ms
Но реализовать их у меня не получилось
И поведение Tabix будет не предсказуемо с этой галкой ( -
Для упрощения -> Requirements: Not readonly CH user )))
-
понятно, спасибо
-
Joined.
-
Всем привет. Кто нибудь знает функцию для обработки URL, которая отрезает у урла все slug'и, GET-параметры и фрагменты, оставляя только <protocol>://<domain> ?
Первое что приходит в голову использовать URLHierarchy(...)[1] , но возможно кто нибудь знает варианты лучше? -
посмотри
/etc/clickhouse-client/config.xml
или ты ищешь какой-то особый конфиг? -
Может, так?
protocol(page) || '://' || domain(page) AS path -
Такую красоту хотел оставить навариант Z :) если больше вариантов не будет, то сегодня вечером сравню эффективность обоих подходов
-
и что мне туда добавить, чтобы нормально загрузить таймзону?
-
Подскажите, в ClickHouse есть какой-нибудь аналог PIVOT?
-
/etc/clickhouse-server/config.xml
Обычно тут есть секция <timezone>Europe/Moscow</timezone> -
посмотрите какое у вас там значение
-
это же для сервера. или клиент использует эту информацию?
-
ну у клиента есть свой конфиг, у вас же там как-то появилась таймзона W-SU
-
В запросе или визуализация ?
-
в запросе
-
имхо близкое sumIf,countIf...
-
-
-
-
-
Всем привет, а есть у кого-нибудь опыт подружить CH и Talend?
-
-
-
У нас есть, обсуждали в этом чате пол года назад 🙂
-
Не могу понять в чём ошибка: пробую засунуть в поле ipv6 адрес как FixedString(16) - получаю не то, что на входе.
Делаю таким тестовым скриптом:
#!/bin/bash
DB=proba
DATATABLE=iptest
# for debug: start from scratch
clickhouse-client —echo —database=$DB —query="DROP TABLE IF EXISTS $DB.$DATATABLE"
echo Creating table $DB.$DATATABLE if needed
clickhouse-client —echo —database=$DB —multiline —query="CREATE TABLE IF NOT EXISTS $DB.$DATATABLE ("\
"d Date,
ip_prefix String,
ip6 FixedString(16) default toFixedString('',16),
ip6str String,
prefix_len UInt8
) ENGINE = MergeTree(d, (d, ip6), 8192)"
echo '{"timestamp": "2017-09-14", "ip_prefix": "2a0b:aa80::/29"}' \
| clickhouse-local —table=TMP \
—input-format=JSONEachRow \
—verbose \
—structure='timestamp String,ip_prefix String' \
—query=\
"SELECT
timestamp,
ip_prefix,
(position(ip_prefix,':') > 0) ? IPv6StringToNum(extract(ip_prefix,'^(.+)/')) : IPv6StringToNum('0') as ip6,
(position(ip_prefix,':') > 0) ? extract(ip_prefix,'^(.+)/') : '' as ip6str,
(position(ip_prefix,'/') > 0) ? toUInt8(extract(ip_prefix,'/([0-9]+)')) : 0 as prefix_len
FROM TMP FORMAT CSV" \
| clickhouse-client —database=$DB —query="INSERT INTO $DB.$DATATABLE FORMAT CSV" —progress
clickhouse-client —database=$DB —query="SELECT *, IPv6NumToString(ip6) as ip6fromNum, IPv6NumToString(IPv6StringToNum('2a0b:aa80::')) FROM $DB.$DATATABLE FORMAT Vertical"
В результатет получаю такое:DROP TABLE IF EXISTS proba.iptest
Creating table proba.iptest if needed
CREATE TABLE IF NOT EXISTS proba.iptest (d Date,
ip_prefix String,
ip6 FixedString(16) default toFixedString('',16),
ip6str String,
prefix_len UInt8
) ENGINE = MergeTree(d, (d, ip6), 8192)
Executing query: CREATE TABLE TMP (timestamp String,ip_prefix String) ENGINE = File(JSONEachRow, stdin)
Executing query: SELECT
timestamp,
ip_prefix,
(position(ip_prefix,':') > 0) ? IPv6StringToNum(extract(ip_prefix,'^(.+)/')) : IPv6StringToNum('0') as ip6,
(position(ip_prefix,':') > 0) ? extract(ip_prefix,'^(.+)/') : '' as ip6str,
(position(ip_prefix,'/') > 0) ? toUInt8(extract(ip_prefix,'/([0-9]+)')) : 0 as prefix_len
FROM TMP FORMAT CSV
Read 1 rows, 42.00 B in 0.005 sec., 190 rows/sec., 7.82 KiB/sec.
Row 1:
──────
d: 2017-09-14
ip_prefix: 2a0b:aa80::/29
ip6: \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
ip6str: 2a0b:aa80::
prefix_len: 29
ip6fromNum: 1100:: <------— откуда здесь такое значение вместо 2a0b:aa80:: ?
IPv6NumToString(IPv6StringToNum(\'2a0b:aa80::\')): 2a0b:aa80:: -
Добрый день, а можно ли этот запрос выполнить оптимальней, чтобы не делать двойной проход:
SELECT 'soft' as type, userId, uniq(Email) as counts from table where date >= '2017-09-01' and level = 2 group by userId
union all
SELECT 'other' as type, userId, count() as counts from table where date >= '2017-09-01' and level <> 2 group by userId -
select multiIf(level=2, 'soft', 'other') as type ...
-
Joined.
-
А кроме причин "lost forever" описанных вот тут: https://github.com/yandex/ClickHouse/blob/master/dbms/src/Storages/StorageReplicatedMergeTree.cpp
Могут быть еще какие-то? или хотя бы в какую сторону посмотреть? Непонятно почему куски теряются. Редко, но бывает. Причем иногда в тех таблицах, по которым нет активности около месяца.yandex/ClickHouseClickHouse is a free analytic DBMS for big data. Contribute to yandex/ClickHouse development by creating an account on GitHub.
-
Joined.
-
Joined.
-
-
-
А в функцию timeSlot не планируется добавить возможность менять размер слота?
-
Например не 30 минут, а 5 секунд?
-
-
-
Да. Есть например время в 23 секунды и надо округлить до 20
-
Можно с делением поиграться на самом деле
-
-
Up. Хелп плиз. Куда копать? При достижении лимита памяти кликхаус намертво виснет, отжирая память.
-
Уточните общий размер оперативной памяти, доступной и настройки КХ по лимитам по памяти
-
Неужто никто не ткнёт пальцем в чём косяк? Кладу в базу одно значение, а вынимаю другое. Вроде простая штука и всё по букварю делаю...
-
и что значит "отжирая" ? размер занимаемой памяти увеличивается? и что в логах ?
-
http://paste.org.ru/?6izk35 - похоже что норм, а какая версия?
-
v1.1.54231
Вот и я дивлюсь. Начал уже багу на ровном месте подозревать...
Проверил - в 1.1.54236 та же фигня.
Может дело в сборке? У меня они на CentOS 7 крутятся. -
max_memory_usage у КХ дефолтный - 10000000000, в docker-compose.yml задан лимит 10 Гб для clickhouse-server
-
потребляет максимум доступной памяти, пока не вырубишь.
в контейнере каталог /var/log/clickhouse-server пустой почему-то -
yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data.
-
Joined.
-
доброго дня, коллеги! Кинье пжлст ссылку в документацию по апгрейду базы
-
есть ли там какие-то серьезные сложности, подводные камни?
-
-
-
нет, у меня тяжелый случай - база 0-какая-то, надо до 1.1 хотя бы дотянуть. Вот и возникает вопрос - есть ли какая-то процедура апгрейда базы?
-
Нет, дело в старой версии. собрал 1.1.54236 - и в ней плохо.
-
Есть 99% уверенность, что оно нормально проапгрейдится, если просто поставить новую версию на всех репликах.
1% остаётся. Ради этого неплохо было бы сделать бэкап. Бэкап можно путём снапшота диркетории ClickHouse. -
спасибо!
-
Спасибо! Значит буду обновлять. Хотя странно, конечно, что такое незамеченным было.
-
-
В одном из прошлых релизов мы сделали так, что настройки можно передавать и в режиме readonly, но только если их значения не отличаются от уже выставленных. То есть, если в профиле по-умолчанию уже указано send_progress_in_http_headers=1, то при передаче по HTTP такой же настройки, сервер не будет ругаться в режиме readonly.
-
Решардинг (перебалансировка данных) не поддерживается. Но ничто не мешает добавлять новые шарды в кластер, даже налету. Просто в этом случае данные не перебалансируются - будут более заполненные и менее заполненные шарды, нагрузка по шардам будет неравномерной. Это вполне нормальное решение для расширения кластера.
-
Не поддерживается вообще?
-
Попробуйте установить последний пакет tzdata. Если не поможет - пропишите в config.xml в секции timezone значение Europe/Moscow. Если и это не поможет, то найдите подходящую таймзону в /usr/share/zoneinfo и пропишите её в конфиге.
-
Да, мы сейчас не поддерживаем это. Было реализовано до стадии "бета", а потом заброшено. Там были нерешённые проблемы. Есть ещё шанс доделать.
-
URLHierarchy - довольно тяжёлая функция. Для этой задачи конкатенация протокола и хоста будет лучше. Надо будет отдельную функцию сделать.
-
-
Сервер присылает клиенту свою таймзону, а клиент пытается её загрузить для использования.
-
Да, есть такое ограничение. Фактически DROP PARTITION выполняется на реплике-лидере. Если задать запрос на другой реплике, то запрос проксируется. Причём, это проксирование делается неаккуратно - не учитывает тот факт, что имя таблицы на реплике может отличаться.
-
@milovidov_an Алексей, а по последнему стейблу нет еще changelog'a? В гите не нашел (
-
В целом плохо. Если использовать ReplicatedMergeTree с большим количеством таблиц - будет много проблем. Если обычные MergeTree, то будет более-менее работать.
Есть два варианта:
1. Всё-таки сделать более грубую ротацию данных. Скажем, не так уж часто бывает, что каждые сутки данными заполняется весь дисковый массив и данные необходимо ротировать чаще.
2. Дождаться реализации партиционирования по произвольному ключу (сейчас в разработке). -
Можно проследить историю куска по логу сервера (просто grep по его имени). Также есть возможно включить системную таблицу part_log - см. в config.xml - там будет сохраняться история действий со всеми кусками.
-
Время выполнения не должно отличаться от FORMAT TabSeparated. Но конечно, в случае большого результата, будет медленнее, чем с форматами RowBinary или Native.
Увеличение времени может быть случайностью. Если воспроизводится, то хотелось бы пример. -
Это бывает, если ограничения на потребление оперативки запросами (max_memory_usage, max_memory_usage_for_user, max_memory_usage_for_all_queries) или размеры кэшей, превышают то количество оперативки, которое доступно на сервере.
Значения по-умолчанию (например, max_memory_usage - 10 GB) рассчитаны на полноценный сервер. -
У нас есть внутри таск - адаптировать (уменьшать) параметры по-умолчанию под сервер, на котором запущен ClickHouse.
-
Мы даже не думали об этом, так как эта функция была почти ненужной. Можно добавить, но я не могу сказать, что это планируется.
-
спасибо
-
Надо бы для Docker образа подложить изменённый конфиг с уменьшенным лимитом.
-
Если баг исправлен - значит мы его заметили и не зря делали релизы :)
-
На уровне языка запросов пока не рассматривали. То есть, прямо сейчас не планируем это добавить.
-
Changelog скоро будет.
-
Спасибо, задокументирую в табикс
-
Это не критично :) Прикидываю разные варианты как все это дело считать. Считаем пики внимания в видео. И было бы не плохо считать перемотку с одного слота в 5 секунд в другой слот в 5 секунд, из-за длины видео, размер слота может меняться. Вроде как эту проблему можно решить путем использования intDiv )
select intDiv(23, 5) * 5, например -
Да, это естественное решение. Просто округлять время.
-
У меня все еще проще ) Нет времени, есть просто какой то момент в рамках видео, например 14-я секунда видео.
-
-
Joined.
- 15 September 2017 (78 messages)
-
а receive_timeout не работает на запросах типа clickhouse-client --query="INSERT INTO ... FORMAT TSV" --receive_timeout=3600 ? Прост поймали когда 5 минут не слать данные в stdin клиенту ничего, а потом опять слать, то сервер рвет соединение с эксепшеном по таймауту https://github.com/yandex/ClickHouse/blob/dc5eca0bebf41bf91b88ec3bcc24e664e5d22f3d/dbms/src/Server/TCPHandler.cpp#L267 и есть подозрение что настройка в 3600 не работает и юзается дефолтная 300yandex/ClickHouse
ClickHouse is a free analytic DBMS for big data.
-
помогло только выставить ее в users.xml в 3600
-
Возможно, что такие настройки не вступают в силу, если соединение уже установлено. То есть, они должны быть выставлены до установления соединения.
Хотя ничто не мешало бы смотреть на настройки и соответствующем образом менять параметры соединения. Но это не сделано.
То есть, такое поведение неудобно, но объяснимо. -
Спасибо за changelog!
-
Спасибо за changelog
-
-
-
EventTime + 3600 * 6
-
спасибо))) не догадался что надо просто секундами добавлять, думал мб функция есть
-
Все просто ) под капотом datetime это обычный unix timestamp
-
По воводу 1.1.54289 релиза, там исправлена ошибка ALTER на ReplicatedMergeTree после выполнения ALTER MODIFY элемента Nested структуры,
мы вчера 1.1.54284 словили ошибку с битыми данными на ALTER Enum (начало жаловаться на то что типы не соответствуют).
Еще мы вчера словили n-e количество сегфолтов на ровном, казалось бы, месте. Нужно было заинсталировать кластер с нуля, но часть таблиц у нас недоехала,
к ним шло обращение и сервер отдавал станратно что таблици нет, после этого вкатили CREATE TABLE ... ON CLUSTER и ноды стали вываливаться одна за другой
Кусок лога https://gist.githubusercontent.com/kshvakov/0b27e91074533f5549ec89e881a645e2/raw/b219c2405f14890f4eb83a4700d4f8fed766e00e/gistfile1.txt
Плюс еще что-то пошло нетак с создание MATVIEW и при вставке в целевую таблицу ругалось что таблици от VIEW нет,
создать ее нельзя т.к. ругалось на то что реплика уже существует (VIEW - реплицируемая)
Короче, вчера у нас была маленькая пятница ) -
У меня была похожая проблема с ddl запросами. Ноды рандомно зависали, причем всегда две и из разных шардов. Вылечил обновлением.
-
Но после обновления появилась проблема с limit by )
-
-
Могу чуть позже сказать версию, еще в дороге, не помню точно какая у нас сейчас. Проблему сейчас в логе найду, мы с Алексеем ее обсуждали
-
-
Отправил в личку, т.к. там 18 сообщений
-
-
Там же лимит вроде как прописывался изначально? Т.е. сколько максимум словарь может сожрать оперативки
-
-
всем привет. есть необходимость перераспределить данные - добавили в кластер новый шард, хочется не заливать новые данные только на него, а перераспределить старые.
решардинг, насколько я понимаю, до сих пор в бетте.
есть идея сделать через detach/attach partition, но не уверен, что кликхаус нормально на такое отреагирует.
никто не пробовал? или может есть другие идеи, как такое сделать? -
-
Посмотрите в документации, там описано как указать вес шарда
-
-
вес шарда - это хорошо. но заливаться будет только на него (а потом и выборка будет только с него). не очень хочется такого перекоса по нагрузке.
-
Так сначала укажите новому шардру сильно больший вес. А когда данные выровняются - уберите перекос
-
-
вот я тоже об этом подумал. что в какой-то момент большая часть запросов будет валиться на него
-
Привет!
Подскажите, пожалуйста, а если какая-нибудь настройка для ограничения времени выполнения запроса? -
а ключ шардирования? он только на вставку влияет? т.е. в данных его нет и т.п. ведь при переносе мы, по сути, его принудительно меняем для тех данных, что были ранее вставлены
-
-
не нашёл информации об этом в доке...
отлично. спасибо! -
-
-
RENAME ждёт выполнения всех остальных запросов. Если запросы идут непрерывно, то будет ждать вечно.
-
-
Мержится всё это время?
-
-
Мержи тоже блокируют rename.
-
-
-
Нет, он не прерывается. Если совсем плохо, то можно сделать forcerestart сервера.
-
-
-
Такой возможности нет. Но вряд ли это требуется для ClickHouse, потому что индексы занимают очень мало места и кэшируются в оперативке.
Проверьте:
find /opt/clickhouse -name '*.idx' -or -name '*.mrk' | xargs wc -c -
-
Joined.
-
Joined.
-
Joined.
-
Добрый день, подскажите секция With в Select умеет только скалярные значения возвращать?
Есть желание сделать следующе:
WITH (SELECT id FROM dictionaries.dic) AS dic_items SELECT f1 FROM table WHERE f2 in dic_items
Но это только генерит ошибоньку DB::Exception: Scalar subquery returned more than one row... -
-
Да, только скалярные.
-
-
-
Здравствуйте!
Падаем с ошибками:
2017.09.15 13:25:41.593455 [ 2003 ] <Error> void DB::ReplicatedMergeTreeRestartingThread::run(): std::exception. Code: 1001, type: std::system_error, e.what() = Resource temporarily unavailable
2017.09.15 13:25:41.593922 [ 2002 ] <Error> void DB::ReplicatedMergeTreeRestartingThread::run(): std::exception. Code: 1001, type: std::system_error, e.what() = Resource temporarily unavailable
2017.09.15 13:25:41.600634 [ 2004 ] <Error> void DB::ReplicatedMergeTreeRestartingThread::run(): std::exception. Code: 1001, type: std::system_error, e.what() = Resource temporarily unavailable
что может быть? -
Используется очень большое количество мелких таблиц - создаётся много потоков - следующий поток невозможно создать.
-
коллеги, а где-то существует репозиторий с пакетами clickhouse для debian?
-
Не видел. Часто можно выбрать "соответствующую" Ubuntu и взять пакет для ней.
-
а какая убунта соответсвует debian jessie?
-
Не знаю. Надеюсь, кто-нибудь другой в этом чате подскажет.
-
-
-
спасибо!
-
-
-
-
Помогите раступить обратно? КХ слушает только локалосты, а пользователю можно коннектиться с других хостов. Что-бы могло быть?
➜ ~ netstat -nlp | grep clic
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 8584/clickhouse-ser
tcp 0 0 127.0.0.1:9009 0.0.0.0:* LISTEN 8584/clickhouse-ser
tcp 0 0 127.0.0.1:8123 0.0.0.0:* LISTEN 8584/clickhouse-ser
tcp6 0 0 ::1:9000 :::* LISTEN 8584/clickhouse-ser
tcp6 0 0 ::1:9009 :::* LISTEN 8584/clickhouse-ser
tcp6 0 0 ::1:8123 :::* LISTEN 8584/clickhouse-ser
а в users.xml
68 <networks incl="networks" replace="replace">
69 <ip>::/0</ip>
70 </networks> -
-
listen_host в config.xml
-
-
-
Довольно давно (не меньше полугода назад) было изменение, что сервер слушает по-умолчанию только localhost.
-
-
Интересно: нашёл способ как заставить тестовый пример заработать в этой старой версии.
Если вместо
(position(ip_prefix,':') > 0) ? IPv6StringToNum(extract(ip_prefix,'^(.+)/')) : IPv6StringToNum('0') as ip6
написать
(position(ip_prefix,':') > 0) ? IPv6StringToNum(extract(ip_prefix,'^(.+)/')) : IPv6StringToNum(ip_prefix) as ip6
то всё отрабатывает нормально без вылета по эксепшн.
PS: и, по-хорошему, надо было бы заменить формат в последнем pipe на FORMAT Native, но и с CSV прокатило (повезло). -
Joined.
-
-
-
Спасибо, рассмотрим этот вариант)
- 16 September 2017 (15 messages)
-
Здравствуйте!
А как наверняка выяснить лидера из двух реплик одного шарда? -
Select from system.replicas
-
Маленькии вопросик по drop partition
Если запустить на распределенной таблице можно надеятся что выполнится на всех нижележащих MetgeTree ? -
-
Можно сделать ALTER TABLE table ON CLUSTER cluster DROP PARTITION ...
-
Запрос должен полететь по кластеру
-
Или речь не об этом?
-
Спасибо
-
Об этом
-
наверное
-
Ну я так понял, что есть кластер и нужно дропнуть партицию с таблицы на всем кластере. Если речь об этом, то ON CLUSTER должен решить эту проблему
-
да об этом, спсб
-
Пожалуйста :)
-
Не знаю на счет чисел с плавающей точкой, но у меня есть БД собранная из файлов, которые в сжатом виде весят 400 Gb. Таблица с нагенерированными данными соразмерная количеству строк в файлах, а их примерно 3ккк, весит в сжатом виде всего 22 Gb. Все данные - строки, в таблице всего 4 колонки. Так что сжатие очень хорошее, даже на строках.
-
Про float 0.1+0.1 != 0.2 рекомендуется int
- 17 September 2017 (17 messages)
-
Всем привет.
Подскажите, плиз, пытаемся внедрить графану, попробовали datasource от vertamedia, но он какой-то кривой(Графики при группировки по дате странно выглядят, таблицы по датам в принципе чушь показывают).
Есть ли какой-то аналог datasource?(на сайте графаны не нашел)
Или может посоветуете аналогичную тулзу с конструктором отчетов\графиков? -
-
-
-
Вот пример. Таблчика создана через конструктор запросов
-
Выбрано показывать последние 2 дня.
-
Запросы смотрел. У первой колонки
date >= toDate(1504981022)
у второй
date >= toDate(1504721822) -
+ еще бок с таймзонами
Цифры не сходятся по дням, похоже какой-то сдвиг timestamp применяется -
Еще по таблицу забавная штука
Если показываю всего одну колонку, то выводится 4 даты, если две колонки, то уже 5 строк -
-
-
-
Перекопали все настройки\конфиги, ничего такого не нашли. Версии везде последние=(
-
Joined.
-
Таблица выше создавалась при графане 4.4.1 и плагине 0.1 версии.
Сейчас обновились на актуальное - Настройка interval вообще пропала... -
Проблема решилась обновлением vertamedia-clickhouse-datasource до версии 0.0.2
Оказалось, что первая версия будет установлена не через grafana-cli plugins install vertamedia-clickhouse-datasource
а через копирования модуля в папку plugins.
Поэтому обновление через
grafana-cli plugins update vertamedia-clickhouse-datasource
не прошло -
с timezone все тоже решили проблему, правда, как мне кажется, немного костыльно.
Как оказалось, группировка идет по округленному timestamp.
Итого пришлось $timeSeries заменить на (intDiv(toUInt32(dateTime)+3*60*60, $interval) * $interval) * 1000
наверное надо фича реквест создать на проброс таймзоны внутрь $timeSeries - 18 September 2017 (112 messages)
-
С таймзонами в кх вообще беда :(
-
Например используется старый формат именования (не UTC, а Zulu и т.д.) :)
-
Время с таймзоной используете для ключа?
-
да нет, ввод/вывод. Приходится на стороне приложения все манипуляции проводить.
-
-
а как хроните? в каком формате?
-
В utc все переводим для хранения
-
всегда есть DateTime и его обрубок в ключе
-
-
Joined.
-
-
Joined.
-
-
Joined.
-
Joined.
-
Joined.
-
Всем привет. Подскажите пожалуйста, почему я получаю формат JSON втаком виде? спасибо
-
-
Уточните, что вас не устраивает в JSON ответе?
-
формат у него NoneType
-
Где NoneType? В первом запросе
http://joxi.ru/MAjZVGPtvEgkWA
явно указано что отдавать ответ в виде JSON1505724674663 (148 kb) uploaded September 18, 2017 Joximade using Joxi.net
-
тоже понять не могу, раньше не было такого
-
нашел в чем причина, спасибо
-
-
И в чем же?
В nodejs такой же запрос отрабатывает
http://joxi.ru/1A5veylcKvRwYr1505724962235 (96 kb) uploaded September 18, 2017 Joximade using Joxi.net
-
я функцию обработки ответа неправильно написал, я новичок в программировании
-
-
-
а через условие нельзя сделать фильтрацию NULL значений?
-
-
в смысле? мне их не нужно фильтровать, мне нужно выводить NULL где NULL при агрегации
-
Joined.
-
у меня JSONEachRow работал значительно быстрее, относительно второго варианта (файл ~800 мб)
-
сколько полей/запись?
-
10 полей/запись
-
спасибо
-
-
привет, такая проблема: как воспользоваться groupArray совместно с distinct ?
мой нерабочий запрос
SELECT technology, groupArray( DISTINCT tuple(latitude,longitude))
FROM celmes
WHERE project_id = 10 AND time >= '1464739200' AND time <= '1474070400' AND mcc = 401 AND mnc = 7
GROUP BY technology -
-
спасибо, это мне и нужно
-
toInt64OrZero
-
Всем привет!
-
Настраивается ли колличество процессов отведённых для мёржа кусков для MergeTree или эта операция не параллелится?
-
а мне не нужен 0 мне именно NULL нужен, тк по логике у меня:
0 - трафика передано 0
NULL - данные не получены -
-
-
-
хранить мне это все равно в string - тк там еще и массив может быть
-
Кто нибудь знает, есль ли функция обрезания завершающего слеша в URL ? Например https://example.com/ - > https://example.com
-
-
а что в итоге нужно получить? может быть substring подойдет?
-
-
Унифицировать строки вида https://example.com и https://example.com/ . Совет выше в принципе помог, есть функция appendTrailingCharIfAbsent
-
понятно, тогда substring тоже мог бы сойти:
substring('https://example.com/',1,19) -
Адреса соответственно могут быть разные и мы не знаем позицию последнего символа)
-
-
-
-
-
Добрый день!
Наблюдаю периодически ошибку при вставке данных
Logical error: part spans more than one month
Однако, в документации указано, что рекомендовано группировать по месяцам при вставке данных, однако это не является обязательным условием.
С чем может быть связано и как решить ее? -
в моей версии кх такой запрос выдает пустое значение
-
replaceRegexpOne('https://example.com/','(htt(p|ps)://.*)/$','\\1') вроде так еще работает
-
Коллеги, добрый день, подскажите, пожалуйста, а где можно взять jar-ник со всеми dependencies для jdbc? Никак не получаетя подружить Talend и ClickHouse
-
Попробуйте на базе этой статьи скомпилить jar
http://blog.magazov.com/clickhouse-intellij-idea/Clickhouse + Intellij IdeaЧтобы подключить clickhouse к вашему любимому продукту от JetBrains, выкачаем репозиторий с jdbc клиентом: ➜ git clone https://github.com/yandex/clickhouse-jdbc.git соберем драйвер: ➜ cd clickhouse-jdbc ➜ mvn package assembly:single -DskipTests=true В директори target/ получим наш jar ➜ clickhouse-jdbc git:(master) ls target/*dependencies.jar target/clickhouse-jdbc-0.1-SNAPSHOT-jar-with-dependencies.jar Открываем
-
Могу скинуть скомпиленый драйвер 0.1.26
-
Будьте добры, пожалуйста
-
Я с убунтой почти не знаком. Компиляция заглохла на нехватки JAVA_HOME и дальше я не раскопал..
-
я компил в контейнере докер образа с мавеном :)
-
Вот версия 0.1.27 https://yadi.sk/d/N2EetXom3MzRPQ (собрана под Ubuntu 17.04)clickhouse-jdbc-0.1.27-jar-with-dependencies.jar
View and download from Yandex.Disk
-
открылось, кажется
-
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". вот так(
-
Сейчас попробую пересобрать
-
Такого нет в зависимостях этого драйвера. Скорее всег ругается на что-то другое. А разве Talend не на джаве написан?
-
Как вы вообще что-то можете запустить без установленой JAVA_HOME?
-
А какая у вас версия?
-
1.1.54289 - судя по последней версии в докере
-
Коллеги, привет. Попробую ещё раз кинуть клич. Очень нужен на RIW рекламодатель, который использует технологию clickhouse и может поделиться своим опытом.
-
На джаве, просто таленд на винде, а кх на виртуальной убунте
-
На 1.1.54284 такого не наблюдаю. Работа с различными месяцами корректная
-
И вы указываете драйвер где? В таленде на винде?
-
Да, победил проблему! Видимо этой компоненте (tJDBCConnection) не хватало ещё 1 джарника. Добавил как на картинке и заработало.
-
-
Спасибо вам большое!
-
-
Функция позволяет преобразовать Nullable значение в не Nullable. Работает следующим образом: если значение не NULL, то возвращает его. Если значение NULL, то возвращает некоторый не специфицированный результат.
-
Спасибо, но мне же это не позволит засунуть Null в числовой тип?
-
Попробуйте toInt64OrZero от Nullable строки. Эта функция должна вернуть NULL, если аргумент NULL (и ноль, если аргумент не NULL, но не парсится как число).
-
Спасибо, кажется работает, не мог подумать что эта функция может не преобразовывать NUll.
Ранее я тут спрашивал но повторюсь, вдруг тоже поможете - если у меня есть строки типа string и внутри как цифры так и нули, я бы хотел их агрегировать sum() и что бы при попадении NULL - результатом агрегации был бы NULL -
-
Сейчас все агрегатные функции возвращают не NULL, агрегируя только не NULL-значения.
-
-
Можно какой-нибудь комбинатор реализовать. Например, -OrNull: sumOrNull и т. п.
-
-
Маленькая просьба.
https://news.ycombinator.com/newest
Надо на этой странице найти нашу статью "Evolution of Data Structures in Yandex.Metrica" и нажать слева треугольник "вверх".
Перед этим придётся зарегистрироваться. Но не стоит беспокоиться - на этом сайта самая лучшая регистрация из всех, что я видел :) -
done
-
To the moon 🚀
-
-
подскажите, пожалуйста, что может быть не так: есть распределенная таблица
CREATE TABLE postgres.user_subscribes_new ( site String, ctime DateTime DEFAULT now(), blog_id UInt32, post_id Nullable(UInt32), user_id UInt64, event UInt8, chour DateTime MATERIALIZED toStartOfHour(ctime), cdate Date MATERIALIZED toDate(ctime)) ENGINE = Distributed(sports, \'local\', \'user_subscribes_new\', blog_id)
есть локальные таблицы на 6 шардах (3x2):
CREATE TABLE local.user_subscribes_new ( site String, ctime DateTime DEFAULT now(), blog_id UInt32, post_id Nullable(UInt32), user_id UInt64, event UInt8, chour DateTime DEFAULT toStartOfHour(ctime), cdate Date DEFAULT toDate(ctime)) ENGINE = ReplicatedMergeTree(\'/clickhouse/tables/{shard}/subscribes\', \'{replica}\', cdate, (site, blog_id, event, chour, cdate), 8192)
вставляю в рапсределенную три раза:
INSERT INTO postgres.user_subscribes_new( site, blog_id, user_id, event, ctime, post_id ) VALUES ('RU', 43590, 23607725, 1, 1, 1406479)
в таблице видна только одна запись, независимо от того, соклько было инсертов. куда посмотреть? -
-
Блоки данных дедуплицируются. При многократной записи одного и того же блока данных (блоков данных одинакового размера, содержащих одни и те же строчки в одном и том же порядке), блок будет записан только один раз. Это сделано для того, чтобы в случае сбоя в сети, когда клиентское приложение не может понять, были ли данные записаны в БД, можно было просто повторить запрос INSERT. При этом не имеет значения, на какую реплику будут отправлены INSERT-ы с одинаковыми данными. То есть, обеспечивается идемпотентность INSERT-ов. Это работает только для последних 100 вставленных в таблицу блоков.
-
блин, дедупликация, точно. я дошел к этому от другой проблемы, а про дедупликацию в mergetree забыл совершенно
-
-
ага, понял. спасибо, вылетело из головы.
-
сейчас осталось понять, решил ли я изначальную проблему )
-
Joined.
-
Господа привет!
меня интересует то, как вставлять rowdata?
вернее как их представлять. в документации это не сказано. -
а как выглядит ваша rawdata?
-
сейчас я тестирую, поэтому допустим
json бы выглядел так
{"date": "01-02-2017", "name": "Marat} -
INSERT INTO table.name FORMAT JSONEachRow подойдет?
-
конечно так подойдет, просто мне интересна именно работа с бинарными данными. Т.к. хочу попробовать сделать все из эрланга, а он с бинарными данными отлично работает
-
Для меня это ПОКА вопрос любопытства, и если я не получу ответ на него, ничего критического не произойдет;)
-
мы обычным lhttpc клиентом ходим к кликхаусу
- 19 September 2017 (91 messages)
-
Господа ) Что-то мы давно не собирались)
-
-
-
Вроде ж сказано все
-
Joined.
-
Всем доброго врменеи суток. Подскажите, как вставить в поле NULL, желательно в TabSeparated или RowBinary формате. В доке не нашёл.
-
А прямой ссылки нет? Уже не могу найти на первых 4х страницах
-
-
-
в TabSeparated – \N
-
-
нашел вот такое
https://github.com/resure/scpnet/wiki/ClickHouse-backupresure/scpnetscpnet - SCP-RU Web Services
-
-
да
ALTER TABLE FREEZE PARTITION
и rsyncom забирать папку КХ -
В RowBinary - просто бинарная единица. Это флаг того, что значение NULL. Если это флаг нулевой, то после него идет само значние. Пример:
echo -ne "\x01\x00\xFF" | clickhouse-local --structure "i Nullable(UInt8)" --input-format RowBinary --query "SELECT * FROM table" 2>/dev/null -
Joined.
-
ребят кто-нибудь сталкивался с тем что после перезапуска кликхауса он не отвечает ни на какие запросы и подключения, а в логах пишет что удаляет что-то постоянно
-
2017.09.19 13:51:01.567860 [ 3 ] <Debug> ads.main_data (Data): Removing part 20170919_20170919_3428120_3428120_0
2017.09.19 13:51:01.573137 [ 3 ] <Debug> ads.main_data (Data): Removing part 20170919_20170919_3428121_3428121_0
2017.09.19 13:51:01.574949 [ 3 ] <Debug> ads.main_data (Data): Removing part 20170919_20170919_3428122_3428122_0
2017.09.19 13:51:01.576726 [ 3 ] <Debug> ads.main_data (Data): Removing part 20170919_20170919_3428123_3428123_0
2017.09.19 13:51:01.578542 [ 3 ] <Debug> ads.main_data (Data): Removing part 20170919_20170919_3428124_3428124_0
2017.09.19 13:51:01.580526 [ 3 ] <Debug> ads.main_data (Data): Removing part 20170919_20170919_3428125_3428125_0
2017.09.19 13:51:01.582195 [ 3 ] <Debug> ads.main_data (Data): Removing part 20170919_20170919_3428126_3428126_0
2017.09.19 13:51:01.583956 [ 3 ] <Debug> ads.main_data (Data): Removing part 20170919_20170919_3428127_3428127_0
2017.09.19 13:51:01.585541 [ 3 ] <Debug> ads.main_data (Data): Removing part 20170919_20170919_3428128_3428128_0
2017.09.19 13:51:01.587274 [ 3 ] <Debug> ads.main_data (Data): Removing part 20170919_20170919_3428129_3428129_0 -
Как-то так в логах
-
Просто даже не знаю что делать
-
Такое у меня было, когда я насоздавайл много (больше 2к) мелких таблиц и заливал туда данные малыми пачками (<1к). Минут через 10-20 оно пишет подобное в лог и запускается
-
Ну у нас одна большая таблица и где-то 6 мелких. Т.е. немного не та ситуация. единственное что перед перезапуском был дроп большой базы. Может быть в этом проблема?
-
Оно просто чистит перед запуском?
-
При дропе данные сразу не удаляются. Так что в вашем случае всё нормально, это идёт непосредственное удаление. В недавних релизах добавили опцию в конфиг, что можно заблокировать таблицу на удаление, если в ней больше указаного кол-ва строк
-
Спасибо боьлшое :)
-
Joined.
-
Всем привет! А есть ли либы для CH, которые могут общаться с сервером по https искаропки?
-
попробовал либу от mail.ru - не хочет https 😕
-
-
-
ой, Go =)
-
GitHub - mailru/go-clickhouse: Golang SQL database driver for Yandex ClickHouse
Golang SQL database driver for Yandex ClickHouse. Contribute to mailru/go-clickhouse development by creating an account on GitHub.
-
вот эта
-
сейчас мучаю https://github.com/roistat/go-clickhouse вроде https появился в нейGitHub - roistat/go-clickhouse: Golang ClickHouse connector
Golang ClickHouse connector. Contribute to roistat/go-clickhouse development by creating an account on GitHub.
-
есть два протокола http и native
https это только если перед clickhouse стоит nginx -
именно так и стоит по соображениям безопасности
-
roistat вроде https умеет, сейчас попробую подсунуть нужные хидеры авторизации OAUTH
-
-
опа =) спасибо
-
Ребятя подскажите, начинающему, это нормально, что ошибка выходит MemoryError, при добавление 1гб текста в CH, надо поменьше кусками добавлять или я что-то не то делаю?
-
ну вот я бы попытался сначала уменьшить размер вставки
-
у вас, похоже, питон падает. Не кликхауз
-
ладно, попробую поменьше кусками, спасибо
-
-
-
судя по трейсу вы делаете копию данных, храните в памяти две копии одних и тех же данных. Да, стоит уменьшить на порядки размер файлов, либо загружать через clickhouse-client. Из привычного вам Jupyter это можно сделать через ! в начале ячейки
-
Спасибо!
-
А что в логах кликхауса?
-
о спасибо, хороший совет.
-
угу, roistat заработал как требуется
-
Добрый день!
Скажите пожалуйста, в чем может быть причина в том, что не происходит заполнение материализированного представления? В docker версии происходит, в нативной установке под ubuntu 16.04 не происходит. Версия 1.1.54284 и там и там, схема одна и та же. Данные схожие. Запрос из которого формируется представление выдает схожие данные как и в MV в docker, а в нативной установке расходятся. Какие логи отвечают за это?
Вижу только, что в докер версии происходит мерж частей в MV, а в нативном нет. -
Что скажете на счет этого поделия http://www.proxysql.com/blog/proxysql-143-clickhouse ?ProxySQL 1.4.3 - the ClickHouse release
Releasing ProxySQL 1
-
Это нормально. Просто пред рестартом сервер помержил эти куски, но не успел удалить куски-исходники (они только через 8 минут удаляются). При рестарте он все приводит в согласованное состояние, проверяет и удаляет ненужные куски, ставит задачу в очередь на скачивание недостающх.
-
Понял, спасибо :)
-
In today's release, ProxySQL 1.4.3, the most important feature is surely the support for ClickHouse as a backend!
Clients can still connect to ProxySQL using the MySQL Protocol, and ProxySQL will query ClickHouse. -
Nice idea!
-
итого, roistat единственные кто сумел подключиться по https без проблем =)
-
Спасибо. То, что надо!
-
А какая проблема с HTTPS?
-
ну другим плагинам указываешь, а им не нравится "https" как протокол
-
вот вся и проблема
-
Нашел интересное поведение КХ.
Если формировать из запроса содержащий JOIN, то нельзя указывать в качестве таблиц данных запросы, даже если они требуются только для алиасов. Иначе не обновляется. В таблицах есть схожие колонки, поэтому из за использования алиасов не происходила "подписка" на изменения в таблице А. А данные приходили в таблицу А позже, чем в таблицу Б, из-за этого данные в MV и не объединялись.
Нам повезло, что есть возможность "подписаться" на 2 таблицы сразу же, однако из за отсутствия алиасов в join, можно также наткнуться на эту проблему. -
Добрый день, подскажите, в чем может быть проблема
clickhouse error: [242] DB::Exception: Table is in readonly mode" query":{"Stmt":"INSERT INTO statistics.daily_statistics_events -
Ну собсно там понятно в чем проблема. Вопрос в том какой барашек ридонли поставил
-
можно как-то убрать ридонли?
-
у меня на слейве повторяется такая ошибки 2017.09.19 14:16:33.699771 [ 9 ] <Error> ReshardingWorker: no node, path: /clickhouse/task_queue/resharding/localhost.localdomain
-
на слейве повис кликхаус, я его перегрузил, вроде бы отпустило
-
Joined.
-
-
-
Добрый вечер
кто-нибудь в курсе, можно ли выделять определенное кол-во ядер на запрос? -
кто знает что за ошибка
<Error> ReshardingWorker: no node, path: /clickhouse/task_queue/resharding/localhost.localdomain ? -
Joined.
-
select arrayElement(groupArray(a),2) from ( select 1 a union all select 2)
-
а можно в кх из json'а вытащить keys и values? в документации не нашел, но аппметрика как-то строит отчеты.
-
-
а можете подсказать, как это устроено в аппметрике? отдаем туда жсон, чтобы было удобное дерево ивентов, в логс-апи тоже получаем жсон.
-
-
-
ок, спасибо. видимо, буду использовать Nested
-
Будет митап в Москве, но не очень скоро - скорее всего в ноябре или конце октября.
А пока ближайший вариант - митап в Берлине 5 октября. -
У нас в планах есть добавление SSL, в том числе, к нативному протоколу.
-
кто-то сталкивался с проблемой DB::NetException: I/O error: Broken pipe: while reading from socket (176....:9000), e.what() = DB::NetException, Stack trace: ?
-
пробовал делать перезапуск, не помогло
-
а, я понял, нужно обновить кликхаус
-
-
-
> при использовании не строгой функции
Это какая? -
toIntOrZero()
-
Напишите пример полного запроса с какими-нибудь данными, чтобы разобраться.
-
Есть данные:
┌─r──────┐
│ 127253 │
│ 125449 │
│ 1 │
│ 125445 │
│ 272 │
│ 285 │
│ 215 │
└────────┘
┌─r─────────┐
│ 2826 │
│ 401622 │
│ 470784040 │
└───────────┘
┌─r──┐
│ \N │
│ \N │
│ \N │
└────┘
r - string
запрос select sum(toInt64(r)) from table; выведет ошибку - Attempt to read after eof: Cannot parse Int64 from String, because value is too short.
т.е по логике данной функции он не может сконвертировать NULL в типе string в NULL в типе int
ожидаю я же следующего поведения: есть данные -
тут тип int
─r_int2─┐
│ \N │
│ 856 │
└────────┘
при запросе select sum(r_int2) from table
я ожидаемо получаю
┌─sum(r_int2)─┐
│ 856 │
└─────────────┘ - 20 September 2017 (113 messages)
-
Подскажите что за файлы могут накапливатся в каталоге distributes таблици
вот к примеру, у нас есть распределенная талица а в ней на сейчас 600К файлов
events_tv20/default@192%2E168%2E1%2E147:9000# ll |wc -l
665566
было больше.
Мы остановили запись во весь шард, там где вот такая нода. и файлики начали рассасыватся.
Какое назначение этих файлов и самое главное какие могут быть причины их накопление? -
Попробуйте комбинато if для sum: sekect sumIf(...), добавив в условие проверку на null
-
Но если внутри null - мне нужно его оставить как null
-
-
-
Помнится мне это данные которые были записаны или не записаны по какой то причине. Алексей как то рассказывал, что есть данные, которые не записались по какой то причине, которые хранятся некоторое время
-
У вас в логах нет ошибок на запись?
-
-
Просто tail -n 100 /var/log/clickhouse-server/clickhouse-server.err.log
-
Есть там чего?
-
Причем смотреть надо на шарде в который отправляете запросы на вставку данных
-
Если там нет ничего, то возможно это какая то другая информация хранится в файлах
-
Содержимое файлов не смотрели?
-
содержимое файлов не смотрели
а влоге вот такое сыпится
2017.09.20 07:40:13.305750 [ 14 ] <Warning> nic.events_local_tv20 (StorageReplicatedMergeTree, CleanupThread): Couldn't remove 20170920_20170920_3230238_3230238_0 from ZooKeeper: no node
2017.09.20 07:40:13.331131 [ 14 ] <Warning> nic.events_local_tv20 (StorageReplicatedMergeTree, CleanupThread): Couldn't remove 20170917_20170920_3230235_3230235_0 from ZooKeeper: no node
2017.09.20 07:40:13.350994 [ 14 ] <Warning> nic.events_local_tv20 (StorageReplicatedMergeTree, CleanupThread): Couldn't remove 20170920_20170920_3230233_3230233_0 from ZooKeeper: no node
2017.09.20 07:40:23.060173 [ 27 ] <Error> events_v2_tv11.Distributed.DirectoryMonitor: Code: 210, e.displayText() = DB::NetException: I/O error: Broken pipe: while reading from socket (192.168.1.145:9000), e.what() = DB::NetException, Stack trace: -
-
какая у тебя версия кликхауса?
-
у меня вчера была ошибка с DB::NetException: I/O error: Broken pipe: на версии 1.1.54236
-
ii clickhouse-client 1.1.54236 amd64 Client binary for clickhouse
ii clickhouse-server-base 1.1.54236 amd64 Server binary for clickhouse
ii clickhouse-server-common 1.1.54236 amd64 clickhouse-server-common -
да, я вчера обновился и проблема ушла
-
-
-
-
подскажите, а каким способом обнову КХ делали?
-
apt-get install --only-upgrade clickhouse-server-common
-
ну и потом перезапуск /etc/init.d/clickhouse-server restart
-
-
Доброе утро!
Скажите пожалуйста, как можно это оптимизировать?
Если в табличке А и в табличке Б по 10к значений с одинаковым id, то это выльется в 100 млн записей по которым потом происходит фильтрация. Но так как нету join по условиям, я даже не представляю как это сделать.
SELECT
id,
local_time,
start_time,
end_time
FROM A
ALL INNER JOIN (
SELECT
id,
start_time,
end_time
FROM B
) USING id
WHERE local_time >= start_time AND local_time < end_time -
А писать в одну таблицу не получится?
-
-
Просто в КХ логика выборки данных сильно отличается от того же MySQL например в котором можно делать констрейны на подзапросы и джоины. В случае с констрейнами сначала выбирается правая таблица, потом на каждую строку с констрейнами в запрос делается подзапрос (в случае подзапроса) и выбираются данные, если это джоин, то происходит почти тоже самое что и при подзапросе. Т.е. будь у вас 10к строк и вы джоините еще 10к строк с констрейнами на джоин, то это будет по сути 10к подзапросов в таблицу, что будет крайне не эффективно.
-
Ощутил это на своей шкуре, когда джоинил в одном запросе на 40к строк еще кучу таблиц в которых от 10 до 100к строк на каждую строку из правой таблицы )
-
Перетащил такое добро в КХ...вы не поверите, но даже на двух виртуальных ядрах КХ справляется шустрее чем MySQL на продакшен сервере с 40 ядрами и 190 гигами оперативы и натюненными настройками, причем MySQL отрабатывает за 30 секунд, а КХ за 0.005.
-
-
-
-
Это печально. Пока ничего в голову не приходит
-
-
-
-
-
Если бы было точное условие, можно было бы напрямую вытащить из второй таблицы :)
Вопрос как можно было бы его сформировать :) -
-
-
-
Joined.
-
Привет,
А кто-нибудь использовал эту обертку дял постгерса?https://github.com/Infinidat/infi.clickhouse_fdw/
задача лезть из постгреса в кликхаус, при импорте схемы не подтягиваются Nullable поля и когда делаешь запросы питон разваливается с KeyErrorInfinidat/infi.clickhouse_fdwA PostgreSQL foreign data wrapper for ClickHouse. Contribute to Infinidat/infi.clickhouse_fdw development by creating an account on GitHub.
-
или может какой-то другой вариант кто посоветует
-
-
коллеги, подскажите решение простейшей задачи, что-то я лбом уперся. Как инсертит в MergeTree в поле date? какой формат? Пишу из python
-
2017-01-01
Покажите код -
а расскажите как odbc настраивали? мне его пришлось подправить под 9.6 иначе не компиллось, а как подключение настроить не понял. Нужно ли дополнительно компилить clickhouse_odbc на хост с постгерсом?
-
я ща посмотрел питоновский fdw не поддерживает даже енамы=(
-
-
CREATE FOREIGN TABLE
test (
id integer,
value text,
ipv6 char(16)
)
SERVER odbc_server
OPTIONS (
schema 'default',
sql_query 'select id, toString(value), ipv6 from default.test',
sql_count 'select count(*) from default.test'
);
CREATE USER MAPPING FOR postgres
SERVER odbc_server;
SELECT id FROM test limit 5;
SELECT * FROM test limit 5;
SELECT count(*) FROM test; -
-
-
Йеее пасиб) ток не вижу где урл доступа к кликхаусу настраивается
-
в дсн не прописываете так как локалхост?
-
меня еще смутило, что непонятно к какому порту коннектится в кликхаусе для одбц
-
-
-
ясно, пасибо огромное!
-
ща буду разбираться
-
-
ETL это что?
-
ну я понял, у вас odbc был временный вариант для миграции. вы его долго в продакшене не гоняли
-
-
-
-
если он сначала затягивает всю таблицу, то все преимущество кликхауса вроде как теряется
-
-
выглядит не очень гибко конечно, но в целом примерно принцип понятен. Если хочется чтобы работало на стороне кликхауса, нужно очень конкретно одбц описывать
-
-
Так odbc для кликхауса я так понимаю вы компили и подключали отдельно?
-
GitHub - ClickHouse/clickhouse-odbc: ODBC driver for ClickHouse
ODBC driver for ClickHouse. Contribute to ClickHouse/clickhouse-odbc development by creating an account on GitHub.
-
вот этот?
-
нет, просто odbc_fdw extension - http://www.postgresonline.com/journal/archives/372-ODBC-FDW-now-supports-9.5-and-9.6.html
-
ну я глянул стрейсом
-
и когда я пишу dsn=ClickHouse он лезет за соовтетствующим драйвером
-
который описан в .odbc.ini
-
для постгреса
-
в общем заработало, спасибо. Я скомпилил одбц драйвер яндекса, добавил так как у вас указано и получается делать запросы.
-
ща покажу как выглядит
-
odbc_fdw тоже пришлось подправить под постгрес 9.6
-
Ребят. подскажите начинающему, что не нравится при вставке данных кликхаусу? неправильно экранированные кавычки?
-
предыдущий скрин не тот, вот этот
-
слишком много \, пишет что ему нужен символ ' перед датой
-
Тут
http://joxi.ru/Q2KGdVKi93D6y2
не должно быть двух слешей1505913296635 (99 kb) uploaded September 20, 2017 Joximade using Joxi.net
-
а как их заменить, чтот я не смог догнать как их экранировать
-
У вас в исходных данных похоже что такое экранирование. Т.е. выход - переделать их
-
такие данные я из logs api яндекса выгружаю. Всем спасибо большое. буду искать решение
-
Попробуйте на данные не питоном посмотреть, может ваш notebook добавляет слеши
-
Вопрос вроде поднимался, но явсного ответа не нашел. Кому нибудь удавалось из Python по HTTPS отправлять запрос на удаленный сервер CH ? Или возможно даже заставить работать какую нибудь ORM (infi, sqlalchemy) по этому протоколу? На сколькопонял на моей машиневсе упирается в паеты OpenSSL. Не из под убунты 16.04 не из под Win10 настроить коннект не удалось, пишет ошибку:
requests.exceptions.ProxyError: HTTPSConnectionPool(host='xxx.xxx.xxx.xxx', port=9003): Max retries exceeded with url: /?query_id=bf184334-9e0a-11e7-bab7-74d435b3245e&database=default (Caused by ProxyError('Cannot connect to proxy.', OSError('Tunnel connection failed: 403 Forbidden',)))
Хотя через curl, как описано в доке, спокойно ходит. -
спасибо, проверю
-
Коллеги, добрый день,
Нашёл незадокументированную фичу Yandex Metrika Logs API - можно скачивать архивы файлов, а значит экономить много времени и трафика.
Для этого необходимо в хедер запроса на выдачу части логов добавить Accept-Encoding:gzip
Пользуйтесь) -
Можно даже сразу этот gz отправить на вход ch )
-
Я думаю, что не зря недокумментированная фича )
-
Все таки упаковать все это дело не дешево для проца
-
-
-
именно со скобками? я думал он по умолчанию стандартный делиметр подхватит (запятую)
-
-
-
-
@SomeoneBehindYou , классная аватарка
-
-
-
Прочитать документацию, особено с использованиеи поиска
-
там не понятен момент с указанием инпут сорса тайпа, можно как то сказать к примеру в конфиги, что все данные в эту таблицу всегда будут приходить в виде json через http api?
-
Нет,так нельзя. Только передавать FORMAT на каждый запрос
-
жаль, было бы здорово если такой функционал появится
-
Напишите прокси, например на nodejs, который будет так делать
-
- 21 September 2017 (83 messages)
-
-
в исходных данных экранирование нормальное \' , но при добавление файла через консоль или при чтение через python, это превращается в \\' подскажите в чем может быть причина?
-
разобрался
-
-
Поделитесь решением
-
replace все решил))
-
-
-
Очевидно он экранировал символы, а там все 8bit safe и экранировать их было не нужно.
-
Коллеги, добрый день, подскажите, пожалуйста, есть ли возможность оптимизации запроса.
SELECT count() FROM hits WHERE date >= '2017-09-04' AND date <= '2017-09-17'
обрабатывает только небольшую часть таблицы
SELECT count() FROM hits WHERE date >= '2017-09-04' AND date <= '2017-09-17' AND domain(url) = 'domain.com'
обрабатывает всю таблицу с начала до конца
Поведение выглядит странным, можно как-то подсказать кликхаусу, что всю таблицу обрабатывать не нужно? -
покажите схему таблицы hits. Непонятно, что значит "обрабатывает всю таблицу с начала до конца: если date в индексе, то нет, не должен
-
-
Индексов нет, тип таблицы -Log
-
Попробуйте движок MergeTree, в движке Log всегда читаются все данные.
https://clickhouse.yandex/docs/ru/single/#mergetree
Положите дату-счетчик в первичный индекс, client_id хорошо подойдет для семплирования (возьмите intHash32), -
Да, уже прочитал про него, сделал вот так MergeTree(date, watch_id, watch_id, 8192) жду когда перельются данные
-
Да, перестал проходиться по всей таблице, спасибо!
-
с моей колокольни лучше будет работать
MergeTree(date, intHash32(watch_id), (date, counter_id, intHash32(watch_id)), 8192)
в вашей конфигурации он всё равно будет ходить по всей таблице, потому что вы не делаете фильтр по watch_id -
У меня только 1 counter_id, так что решил его не включать, дата, на сколько я понял по документации, тоже всегда в индексе. А зачем нужен intHash32 - я не понял
-
-
И судя по моим экспериментам оно так и работает
-
intHash32 нужен чтобы быть уверенным в равномерном распределении ключей: вдруг idшники будут неслучайными по какой-то причине, или, например, последовательными?
Про дату пусть лучше подскажут знающие, в доке везде советуют дублировать и в дате, и в индексе: но, вероятно, вы правы -
на сколько я понимаю watch_id последователен, тогда, видимо, хэширование для сэмплирования оправдано, но хачем хэшировать в индексе пока не понятно..
-
по идее если даты нет в индексе, то при запросах с условием по дате будет фулскан "кусочков", а если дата в индексе есть, то фулскана быть не должно
-
Вот смотрите, у меня таблица 100 строк с данными с августа
select count() from hits_new
обработал 100 строк
select count() from hits_new where date > '2017-09-10'
обработал 30 строк
select count() from hits_new where date > '2017-09-10' and domain(url) = 'bla-bla.ru'
обработал 30 строк -
При том, что engine=MergeTree(date, watch_id, watch_id, 8192)
-
Так что видимо независимо от наличия даты в индексе он индексирует таблицу по дате..
-
Не индексирует, а партицирует
https://clickhouse.yandex/docs/ru/query_language/queries.html?highlight=%D0%BF%D0%B0%D1%80%D1%82%D0%B8%D1%86%D0%B8%D1%8F#id5 -
Поэтому если есть условие на ключ партиции - читается меньше данных
-
Спасибо за поправку! А даст ли что-то добавлние даты в индекс?
-
Попробуйте запрос чтоб он больше месяца затрагивал и прочитайте в интернетах что такое партицирование :)
-
-
Нет, если дата есть в индексе
-
Зависит от типов запросов. Всё основное в документации описано
-
-
-
если вы не фильтруете по id то всегда пробегается по всей партиции. Если вы указываете фильтр на дату и на id, то будет пробегаться только по тому, что вы хотите
-
-
-
-
-
посмотрите что у вас processlist происходит
-
-
-
-
т.е. фактически у меня нет других вариантов кроме как ждать скана всей партиции если надо скопировать всю таблицу, а в оперативку больше суток не влезает?
-
при чем тут оперативка?
Если надо скопировать, то вы в любом случае всё читать будете -
-
-
-
я писал выше проблема в том что приходится select без столбца DATE брать и пересчитывать его
-
В логе криминала тоже никакого. 3.9гб потрачено на запрос и всё.
-
-
У нас такое было, не на ALTER, на SELECT. Вылечилось перезапуском
-
-
Вроде нет, но когда CH без нагрузки отожрал 40% памяти (примерно 30Гб) и не отдает - подозрително
-
коллеги, дурацкий вопрос: есть таблица, в ней есть ключ. Что будет, если в таблицу вставить строку, у которой ключ совпадет с уже существущей? Она перезапишется? Движок MergeTree
-
Нет, не перезапишется. По крайней мере у меня данные дублируются
-
Более чем. У нас схожий кейс. Надеюсь, @milovidov_an прокомментирует.
-
-
можно через zcat как минимум
-
он на лету распаковывает
-
Если по http льёте, то можно выставить заголовок Content-Encoding: gzip и лить.
-
Ребят, подскажите пожалуйста кто знает, а метод ClickHouseStatement.sendRowBinaryStream в jdbc драйвере можно использовать в разных потоках в рамках одной JVM при различных экземплярах ClickHouseStatement? В доке ни слова про потокобезовасность, но потоки явно пересекаются.
-
Из разных Statement должно быть можно, иначе - странно.
По коду проблем не вижу. -
спасибо. попробую
-
-
-
-
А никто не знает кейсы когда AggregatingMergeTree оправданы? а то дисклеймер в документации насторожил
>Заметим, что в большинстве случаев, использование AggregatingMergeTree является неоправданным, так как можно достаточно эффективно выполнять запросы по неагрегированным данных. -
Подскажите пожалуйста, какой функцией отрезать слэш с конца урла если где-то он есть, а где-то нет
-
Можно такое использовать
https://clickhouse.yandex/docs/ru/functions/string_functions.html#appendtrailingcharifabsent-s-c
т.е. не отрезать, а добавить если нет -
Класс, спасибо!
-
Поясните, пожалуйста, как будет работать такая цепочка с точки зрения пикового потребления оперативки ( в ${MSGLOG} список файлов общим объёмом 1-10 гиг:, т.е. будет ли оно пропорционально суммарному объёму или поток данных будет разбит на куски поблочно:
gzip -dc ${MSGLOG} \
| grep -v dump \
| clickhouse-local —table=TMP \
—input-format=JSONEachRow \
—input_format_skip_unknown_fields=1 \
—verbose \
—structure="${logstruct}" \
—query="${query}" \
| clickhouse-client —database=$DB —query="INSERT INTO $DB.$DATATABLE FORMAT Native" —progress -
Подскажите пожалуйста, а есть такая вероятность, что для SummingMergeTree записи никогда (или очень долго) не смержатся
-
-
-
-
Joined.
-
Joined.
-
Joined.
-
-
Joined.
-
Joined.
- 22 September 2017 (80 messages)
-
Добрый день, а нет ли в кликхаусе простого способа собрать олап куб?
-
-
-
OLAP - это не про скорость, это про удобство интерфейса
-
У кх есть одна мажорная проблема, на мой вкус — нулевой тулинг. То, что есть, с ним толком не работает, а нового не написано. В итоге у нас три аналитических интерфейса к нему: Tabix, Jupiter, Redash, и это нас тормозит сильнее, чем замедление от какого-нибудь постгреса. Любые данные можно вытащить только через sql :(((
-
Может кто сталкивался с проблемой
Движок ReplicatedSummingMergeTree
У меня в том списке, где указаны колонки, по которым нужно проводить суммирование, колонки идут не в том порядке, в каком указаны в таблице. Так вот начиная с той колонки, у которой порядок отличается данные левые. Первые две колонки (их порядок такой же, как и в таблице) все бъется с другим источником, а дальше идет не та колонка, которая идет в описании таблицы (в описании она вообще последняя) и вот после нее в данных полный хаос -
версия 1.1.54245
-
вроде в описании нет, что порядок должен соблюдаться
-
на репликах описание одинаковое
-
Ребят, при распределенных запросах КХ сейчас лезет то в реплику, то в лидера, можно ли сделать так, чтобы при DISTRIBUTED-запросе лезли только на лидера и уже в случае его недоступности, в реплику?
-
А кто подскажет, если я выполню два одновременных запроса с использованием временной таблицы из файла через http интерфейс, то никаких конфликтов не будет из-за одинакового названия временной таблицы. Как этот механизм вообще работает?
-
точно не скажу, но кажется что не должно быть. такая временная таблица живет в контексте запроса и ни с кем не пересекается
-
-
Спасибо! )
-
Всем привет, кто нибудь подгружал NULL значения через словари?
получаю
Code: 36, e.displayText() = DB::Exception: Error parsing null_value: DB::Exception, e.what() = DB::Exception, Stack trace: -
-
словарь подгружается через http
-
У меня тут веселее ситуация :)
Есть таблица, в ней есть nested и есть временная таблица, в ней есть колонка Array(String).
Я делаю запрос из первой таблицы и array join nested колонки, это все дело джойню к результату подзапроса из второй таблицы где делаю array join колонки с Array(String) и получаю веселую ошибку: Type mismatch of columns to JOIN by: childEntityIri String at left, childEntityIri Array(String) at right
Хотя "первая" таблица уже развернута и там тип string и "вторая" таблица развернута и там тип string. -
Скриншот от комманды
curl -s localhost:8080/my_dict.tsv | head | less
+ поиск по ^I т.е по табам -
похоже на ошибку в конфиге словарей. можете его показать?
-
а можете запрос показать?
-
<dictionary>
<name>dim_product</name>
<source>
<http>
<url>http://localhost:8080/my_dict.tsv</url>
<format>TabSeparated</format>
</http>
</source>
<lifetime>
<min>300</min>
<max>360</max>
</lifetime>
<layout>
<hashed/>
</layout>
<structure>
<id>
<name>id</name>
</id>
<attribute>
<name>f1</name>
<type>String</type>
<null_value/>
</attribute>
<attribute>
<name>f2</name>
<type>String</type>
<null_value/>
</attribute>
<attribute>
<name>d1</name>
<type>Date</type>
<null_value/>
</attribute>
<attribute>
<name>d2</name>
<type>Date</type>
<null_value/>
</attribute>
</structure>
</dictionary> -
попробуйте задать непустые значения по умолчанию для нестроковых типов
-
минуту
-
-
Row 1:
Column 0, name: product_sku_id, type: UInt64, parsed text: "1"
Column 1, name: dim_product_sku_id, type: String, parsed text: "33000001"
Column 2, name: product_name, type: String, parsed text: "ANCHOR RECTANGULAR GLAS 1.1L PS0042"
Column 3, name: list_date, type: Date, parsed text: "2016-03-04"
Column 4, name: delete_date, type: Date, parsed text: "<BACKSLASH>N<LINE FEED>2<TAB>33000"
ERROR: garbage after Date: "010<TAB>ANCHOR"
ERROR: Date must be in YYYY-MM-DD format. -
Не остановился после <BACKSLASH>N на <LINE FEED>
-
<BACKSLASH>N - это ведь "escaped" null?
-
Ох...сложно, т.к. временная таблица используется, но сейчас напишу.
SELECT
count() AS attemptsTotal,
entityIri,
learnerId
FROM
(
SELECT
learnerId,
entityIri,
childEntityIri
FROM entitiesTempTable
ARRAY JOIN childs AS childEntityIri
)
ANY LEFT JOIN
(
SELECT
learnerId,
entitiesResults.entityIri AS childEntityIri
FROM learners
ARRAY JOIN entitiesAttempts
PREWHERE learnerId IN learnersTempTable
WHERE childEntityIri IN irisTempTable
) USING (learnerId, childEntityIri)
GROUP BY
learnerId,
entityIri -
По отдельности если подзапросы выполнять, то возвращается string и там и там в колонке childEntityIri
-
А если вот так в кучу собрать, то кидает ошибку (
-
Версия 1.1.54246
-
должен быть
-
-
Кажется я нашел проблему...дело не в этом было )
-
Нет, это не массив строк. entitiesAttempts должно быть вместо entitiesResults. Сейчас проверю теорию )
-
Да, блин...причем КХ даже не ругнулая на select entitiesResults.entityIri as entityIri from learners array join entityAttempts
-
Он реально колонку выбирал как массив
-
-
Это да )
-
Уважаемые пользователи Talend, подскажите, пожалуйста, как увеличть таймаут для jdbc clickhouse?
-
-
-
Сравнил с
clickhouse-client --query="SELECT * FROM test FORMAT TabSeparated" > text2 -
Все выглядит правильно
-
По крайней мере, на митапе как-то раз они говорили именно так: ручками написали рекурсивный спуск и успокоились.
-
-
А если записывать через формат RowBinary, как записать NULL?
-
Глупый вопрос: почему clickhouse-client иногда вместо одной таблицы с результатом, разделяет результат на несколько одинаковых таблиц (повторяя каждый раз заголовок).
-
Скорее всего каждая таблица - кусок данных, полученных от сервера. Т.е. клиент их стримит
-
Может есть какой-то способ этого избежать? Это эээ... неудобно. Ведь клиент при этом похоже знает когда данные закончились (не повторяет же он каждый раз инфорамацию о статистике выполнения запроса).
-
-
-
if (string == null) {
stream.writeInt8(1);
} else {
stream.writeInt8(0);
stream.writeString(string);
} -
это только для строк?
-
если ожидается к примеру Datetime то это UInt64
-
или байт 01 просто означает NULL для всех типов?
-
-
-
спасибо
-
попробую через RowBinary записать
-
если в конфиги словаря указан <null_value/> на некий аттрибут, то так что считается Nullabe, верно?
-
без указания значения при null
-
Есть KILL QUERY, но он работает только для SELECT'ов
-
это я знаю, вопрос был - целесообразно ли это?
-
-
Возможности внешне прервать INSERT нет, а эта цифра в PROCESS LIST'e условная, она не означет что эти строки буквально записаны на диск и закоммичены.
-
Действительно помогло. Спасибо :)
-
-
null_value не имеет никакого отношения к Nullable типам, это по факту default value для отсутствующих ключей.
-
Тогда получается что dictGet функции так же не могут возвращать null
-
Еще как вариант использовать FORMAT PrettyCompactMonoBlock
-
Тогда что значит <null_value/>?
-
Да, dictGet функции пока могут возвращать только не-Nullable атрибуты. Типы атрибутов не могут быть Nullable.
-
Такая запись в конфиге эквивалента <null_value></null_value>
-
Спасибо за информацию
-
Т.е. он из пустой строки попытается распарсить значение типа для default value
-
Всем привет. Видел обсуждение про функцию tostartofinterval. Вопрос, ее еще не сделали? или отказались?
-
Может кто сталкивался с проблемой
Движок ReplicatedSummingMergeTree
У меня в том списке, где указаны колонки, по которым нужно проводить суммирование, колонки идут не в том порядке, в каком указаны в таблице. Так вот начиная с той колонки, у которой порядок отличается данные левые. Первые две колонки (их порядок такой же, как и в таблице) все бъется с другим источником, а дальше идет не та колонка, которая идет в описании таблицы (в описании она вообще последняя) и вот после нее в данных полный хаос
версия 1.1.54245
вроде в описании нет, что порядок должен соблюдаться
на репликах описание одинаковое -
- 23 September 2017 (40 messages)
-
Привет ребят, объясните пожалуйста начинающему, что произойдет, если в таблицу MergeTree добавить дублирующие данные, которые уже там есть, они перезапишутся или продублируются? В случае перезаписи, они будут сравниваться по ключевым столбцам указанным при создании таблицы? Я допускаю, что скрипт по добавлению данных, может криво сработать и не добавить данные и чтоб не удалять партицию за месяц, я думаю может еще повторно добавить просто?
-
-
-
Joined.
-
Привет! можно ли создать таблицу типа Replicated, имея только одну ноду?
-
-
спасибо.
-
-
Кто нибудь использует Click в качестве многомерной витрины в DWH ?
-
спасибо всем
-
Скажите пж. , что нибудь с Join улучшилось с момента презентации ??
https://clickhouse.yandex/presentations/uwdc/#27 -
Вроде как ничего не изменилось (
-
+1😔
-
-
Привет, как очистить базу не партициями а полностью?
-
-
Что это значит Сделать на лидере? Я недавно вкатился
-
-
-
ок
-
Я просто делаю дроп тейбл если надо почистить таблицу
-
Так потом заново создавать нужно же
-
Ребят такая проблемма, выполняю запрос clickhouse-client --query="INSERT INTO storage FORMAT CSV" < text.csv получаю ошибку Code: 117. DB::Exception: Expected end of line. Но если сделать head text.csv -n 10 > text.txt и инсертить получившийся text.txt то все хорошо. В чем проблема?
-
Последняя пустая строка?
-
нет
-
Ну если head -n 10 отрабатывает, то очевидно ошибка после первых 10и записей 🙂 Играя с параметром -n можно найти где именно...
-
Да, вы правы
-
Можно как-то игнорировать такие строки?
-
$ clickhouse-client --help | grep allow
--input_format_allow_errors_num arg Settings.h
--input_format_allow_errors_ratio arg Settings.h -
Установил в конфиг файле input_format_allow_errors_num=1000 и input_format_allow_errors_ratio=1, в таблице system.settings показано что значения изменены. Умпортирую 2 строки все таже ошибка
-
Нет, не сталкивался. Сейчас сделал тест, чтобы еще раз убедиться. Вроде бы все правильно работает https://dpaste.de/iEJR
-
А кто может подсказать что за ошибка "2017.09.23 22:03:40.825975 [ 13 ] <Error> void DB::BackgroundProcessingPool::threadFunction(): Code: 10, e.displayText() = DB::Exception: Not found column metric in block. There are only columns: Path, Value, Time, Date, Timestamp, e.what() = DB::Exception, Stack trace:
0. clickhouse-server(StackTrace::StackTrace()+0x16) [0x330d636]
1. clickhouse-server(DB::Exception::Exception(std::string const&, int)+0x1f) [0x1424d8f]
2. clickhouse-server(DB::Block::getPositionByName(std::string const&) const+0x93) [0x2bf8e63]
3. clickhouse-server(DB::GraphiteRollupSortedBlockInputStream::readImpl()+0x4ba) [0x357a6ca]
4. clickhouse-server(DB::IProfilingBlockInputStream::read()+0x1e6) [0x2c17e56]
5. clickhouse-server(DB::MergeTreeDataMerger::mergePartsToTemporaryPart(DB::MergeTreeDataMerger::FuturePart const&, DB::MergeListEntry&, unsigned long, long, DB::DiskSpaceMonitor::Reservation*, bool)+0x293f) [0x34692bf]
6. clickhouse-server(DB::StorageMergeTree::merge(unsigned long, bool, std::string const&, bool, bool)+0x4c7) [0x33b3877]
7. clickhouse-server(DB::StorageMergeTree::mergeTask()+0x14b) [0x33b41eb]
8. clickhouse-server(DB::BackgroundProcessingPool::threadFunction()+0x40e) [0x3492c8e]
9. clickhouse-server() [0x3fca62f]
10. /lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a) [0x7f09b241de9a]
11. /lib/x86_64-linux-gnu/libc.so.6(clone+0x6d) [0x7f09b1a4336d]"
? -
-
А как запрос выглядит?
-
Подскажите,
SELECT toUInt64(number) as n FROM system.numbers LIMIT 50 FORMAT JSON
Возращает n как строку в json, что то мне кажется был параметр что бы изменить поведение ... а то tabix плохо рисует при _Int64 -
А надо что бы как число возвращал?
-
-
Вот эта опция
-
Точно, спасибо! Помню было в чате)
-
Не за что )
- 24 September 2017 (12 messages)
-
Joined.
-
А какой запрос?
-
Может переименовали дефолтные поля для graphitemergetree? Тогда старые значения через rollup xml можно задать
-
В исходниках по старому, скорее всего ты у себя переименовал. Грепни path_column_name в конфигах
-
-
Гайз, перерыл настройки выставил допустимые ошибки при иморте, но кликхаус просто их игнорирует. В чем проблема может быть? В таблице settings показано что значения изменены
-
а это точно настройки севера? я думал это настройки клиента... что то типа того: clickhouse-client --input_format_allow_errors_num 20 --query "insert into table format CSVWithNames" < input.csv
-
Ну я через user.xml сделал, это по сути настроки клиента
-
так тоже пробовал
-
Joined.
-
Не то чтоб переименовал - просто заюзал старый rollup.xml от graphouse 🤦♂️
Закомментировал секцию с путями - все побежало, мержится -
Всем привет.
Подскажите, плиз, тут попалась интересная задачка.
Нужно посчитать среднее время просмотра страницы в разрезе по номеру визита пользователя.
т.е. какой сколько времени пользователи проводят на сайте при первом заходе , при втором, десятом и так далее.
Табличка формата
|date|dateTime|userId|visitTime|
Номера показа не хранится. Идея держать счетчики в другой БД и указывать при инсерте - не катит, так как отчет нужно по старым данным.
Чувствую что нужно использовать что-то вроде runningAccumulate или rowNumberInAllBlocks, но как пока не понимаю. - 25 September 2017 (141 messages)
-
P R
А версия какая? Эти опции кажется в 254 ввели или где то там. Не так что бы совсем давно. -
-
-
-
Эм...табикс жрет опкративку на клиенте
-
И жутко лагает на клиенте
-
А не в докере
-
дададада
Я от безисходности смотрю в сторону связки CH+ProxySQL+Atom.io (MYSQL API) -
Я мониторю табикс, но пока сижу на нативном клиенте
-
Все круто, но лаги капец как напрягают (
-
может оперативки купить?)
-
у кого то и продукты jetbrains тормозят
-
если вкладку не закрывать через 24 часа выжирает 8+ гигов
-
нативный клиент крут и удобен, но хотелось бы IDE
-
а что за задача такая что важно не закрывать ее так долго?)