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