В этом руководстве вы загрузите 28 миллионов строк данных Hacker News в таблицу ClickHouse из файлов в форматах CSV и Parquet и выполните несколько простых запросов, чтобы изучить эти данные.
CSV
1
Скачать CSV
CSV-версию датасета можно скачать из нашего публичного S3 бакета или с помощью этой команды:При размере 4,6 ГБ и 28 млн строк загрузка этого сжатого файла должна занять 5–10 минут.
2
Выборка данных
clickhouse-local позволяет быстро обрабатывать локальные файлы без
необходимости развёртывать и настраивать сервер ClickHouse.Перед загрузкой данных в ClickHouse давайте сначала сформируем выборку из файла с помощью clickhouse-local.
Выполните в консоли:Query
Response
file позволяет читать файл с локального диска, указав только формат CSVWithNames.
Что особенно важно, схема автоматически определяется по содержимому файла.
Также обратите внимание, что clickhouse-local умеет читать сжатый файл, определяя формат gzip по расширению.
Формат Vertical используется, чтобы удобнее было просматривать данные по каждому столбцу.3
Загрузите данные с автоматическим определением схемы
Самый простой и мощный инструмент для загрузки данных — Это создаёт пустую таблицу, используя схему, автоматически выведенную из данных.
Команда Чтобы вставить данные в эту таблицу, используйте команду Вы успешно вставили 28 миллионов строк в ClickHouse одной командой!
clickhouse-client, многофункциональный нативный клиент командной строки.
Чтобы загрузить данные, можно снова воспользоваться автоматическим определением схемы и доверить ClickHouse определение типов столбцов.Выполните следующую команду, чтобы создать таблицу и сразу вставить данные из удалённого CSV-файла, обращаясь к его содержимому через функцию url.
Схема будет определена автоматически:DESCRIBE TABLE позволяет понять, какие типы были назначены.Query
Response
INSERT INTO, SELECT.
С помощью функции url данные будут передаваться напрямую по URL:4
Изучите данные
Чтобы просмотреть выборку историй Hacker News и отдельных столбцов, выполните следующий запрос:Хотя автоматическое определение схемы — отличный инструмент для первоначального изучения данных, оно работает по принципу «best effort» и в долгосрочной перспективе не заменяет явного определения оптимальной схемы для ваших данных.
Query
Response
5
Определите схему
Очевидная и простая оптимизация — задать тип для каждого поля.
Помимо объявления поля времени с типом С оптимизированной схемой теперь можно выполнить вставку данных из локального файла.
Снова используя
DateTime, мы зададим подходящий тип для каждого из перечисленных ниже полей после удаления существующего набора данных.
В ClickHouse первичный ключ данных задаётся с помощью предложения ORDER BY.Выбор подходящих типов и определение того, какие столбцы включить в предложение ORDER BY,
помогут повысить скорость запросов и улучшить сжатие.Выполните запрос ниже, чтобы удалить старую схему и создать улучшенную схему:Query
clickhouse-client, загрузите файл с помощью предложения INFILE и явного INSERT INTO.Query
6
Выполнение примеров запросов
Ниже приведены примеры запросов, которые могут послужить отправной точкой для написания собственных запросов.Генерирует ли ClickHouse всё больше шума со временем? Здесь наглядно показана польза от определения поля Похоже, что “ClickHouse” со временем набирает популярность.
Насколько часто обсуждается тема «ClickHouse» на Hacker News?
Поле score содержит метрику популярности материалов, тогда как полеid и оператор конкатенации || можно использовать для формирования ссылки на исходную публикацию.Query
Response
time
как DateTime: использование подходящего типа данных позволяет применять функцию toYYYYMM():Query
Response
Кто больше всего комментирует статьи, связанные с ClickHouse?
Query
Response
Какие комментарии вызывают наибольший интерес?
Query
Response
Parquet
1
Вставьте данные
Выполните следующий запрос, чтобы прочитать те же данные в формате Parquet, снова используя функцию Выполните следующую команду, чтобы просмотреть выведенную схему:На следующих шагах используются более понятные имена столбцов, такие как
url для чтения данных из удалённого источника:NULL-ключи в ParquetПри выводе схемы столбцы получают тип
Nullable, поэтому требуется allow_nullable_key, хотя в этом наборе данных нет
ID со значением NULL.Query
Response
author и comment, поэтому продолжайте работу с вручную заданной схемой.
Сначала удалите таблицу с автоматически определённой схемой, затем создайте таблицу и вставьте данные напрямую из публичного S3 бакета:2
Добавьте текстовый индекс для ускорения поиска
Чтобы узнать, сколько комментариев содержат упоминание “ClickHouse”, выполните следующий запрос:Затем создайте текстовый индекс для столбца Материализация создаёт индекс для уже существующих данных. Настройка Результат остаётся тем же, поскольку индекс меняет способ поиска ClickHouse подходящих строк, а не сами условия соответствия. Индексированный
запрос обрабатывает значительно меньше данных и выполняется намного быстрее.
Используйте Запись Используйте
Query
Response
comment,
чтобы ускорить этот запрос. Текстовый индекс использует инвертированный индекс, сопоставляющий токены со строками, в которых они содержатся.
Токенизатор splitByNonAlpha разбивает текст по неалфавитно-цифровым символам. В индексе и запросах используется lower(comment)
с поисковыми запросами в нижнем регистре, поэтому сопоставление регистронезависимо. Выражение запроса должно совпадать с выражением, по которому построен индекс.Выполните следующие команды, чтобы создать индекс:mutations_sync ожидает завершения материализации.
Определение индекса можно проверить в таблице system.data_skipping_indices.После материализации индекса выполните тот же запрос ещё раз:Query
Response
EXPLAIN, чтобы убедиться, что ClickHouse планирует использовать индекс:Query
Response
comment_idx показывает, что ClickHouse планирует использовать текстовый индекс. В этом примере план выбирает 547 из 3527
гранул, значительно сокращая объём обрабатываемых данных.Можно также искать один или все из нескольких токенов. Эти функции сопоставляют полные токены, сформированные токенизатором индекса.
Используйте hasAnyTokens, если должен совпасть хотя бы один токен:Query
Response
hasAllTokens, если все токены должны совпадать в любом порядке:Query
Response