Импорт и экспорт пользовательских текстовых данных с использованием шаблонов и регулярных выражений в ClickHouse
Мы часто имеем дело с данными в пользовательских текстовых форматах. Это может быть нестандартный формат, недействительный JSON или поврежденный CSV. Использование стандартных парсеров, таких как CSV или JSON, не всегда сработает в таких случаях. Но ClickHouse предоставляет мощные форматы шаблонов и регулярных выражений.
Импорт на основе шаблона
Предположим, мы хотим импортировать данные из следующего лог-файла:
Мы можем использовать формат Template для импорта этих данных. Нам нужно определить строку шаблона с заполнителями для каждого поля входных данных:
Давайте создадим таблицу для импорта наших данных:
Чтобы импортировать данные с использованием данного шаблона, нам нужно сохранить нашу строку шаблона в файле (row.template в нашем случае):
Мы определяем имя колонки и правило экранирования в формате ${name:escaping}
. Здесь доступны несколько опций, таких как CSV, JSON, Escaped или Quoted, которые реализуют соответствующие правила экранирования.
Теперь мы можем использовать этот файл в качестве аргумента для параметра format_template_row
при импорте данных (обратите внимание, что шаблон и файлы данных не должны содержать лишний символ \n
в конце файла):
И мы можем убедиться, что наши данные были загружены в таблицу:
Пропуск пробелов
Рекомендуется использовать TemplateIgnoreSpaces, который позволяет пропускать пробелы между разделителями в шаблоне:
Экспорт данных с использованием шаблонов
Мы также можем экспортировать данные в любой текстовый формат с использованием шаблонов. В этом случае нам нужно создать два файла:
Шаблон результирующего набора, который определяет макет для всего результирующего набора:
Здесь rows_read
и time
— системные метрики, доступные для каждого запроса. В то время как data
представляет собой сгенерированные строки (${data}
всегда должен быть первым заполнителем в этом файле), основанным на шаблоне, определенном в файле шаблона строки:
Теперь давайте используем эти шаблоны для экспорта следующего запроса:
Экспорт в HTML-файлы
Результаты на основе шаблонов также могут быть экспортированы в файлы с использованием INTO OUTFILE
конструкции. Давайте сгенерируем HTML-файлы на основе данных результата и строки форматов:
Экспорт в XML
Формат шаблона может быть использован для генерации всех мыслимых текстовых форматов файлов, включая XML. Просто используйте соответствующий шаблон и произведите экспорт.
Также рассмотрите возможность использования формата XML, чтобы получить стандартные результаты XML, включая метаданные:
Импорт данных на основе регулярных выражений
Формат Regexp охватывает более сложные случаи, когда входные данные необходимо парсить более сложным образом. Давайте разберем наш пример файла error.log, но на этот раз захватим имя файла и протокол, чтобы сохранить их в отдельные колонки. Сначала давайте подготовим новую таблицу для этого:
Теперь мы можем импортировать данные на основе регулярного выражения:
ClickHouse вставит данные из каждой группы захвата в соответствующую колонку на основе ее порядка. Давайте проверим данные:
По умолчанию ClickHouse вызывает ошибку в случае несовпадающих строк. Если вы хотите пропустить несовпадающие строки, включите эту опцию с помощью format_regexp_skip_unmatched:
Другие форматы
ClickHouse поддерживает множество форматов, как текстовых, так и бинарных, чтобы покрыть различные сценарии и платформы. Исследуйте больше форматов и способы работы с ними в следующих статьях:
- Форматы CSV и TSV
- Parquet
- Форматы JSON
- Регулярные выражения и шаблоны
- Нативные и бинарные форматы
- SQL форматы
Также проверьте clickhouse-local - портативный полнофункциональный инструмент для работы с локальными/удаленными файлами без необходимости в сервере ClickHouse.