Как экспортировать данные PostgreSQL в Parquet, CSV или JSON
Это легко сделать с помощью clickhouse-local:
- Используйте табличную функцию
postgresql, чтобы прочитать данные - Используйте предложение
INTO OUTFILE _filename_ FORMATи укажите нужный формат вывода
Форматом вывода может быть любой из поддерживаемых форматов вывода в ClickHouse. Рассмотрим несколько примеров…
В этих примерах используется clickhouse-local, который входит в состав бинарного файла ClickHouse. Скачайте его следующим образом:
curl https://clickhouse.com/ | shЭкспорт PostgreSQL в Parquet
Табличная функция postgresql позволяет выполнять запросы SELECT (и INSERT) к данным, хранящимся на удалённом сервере PostgreSQL. Например, чтобы просмотреть всё содержимое таблицы в PostgreSQL:
SELECT *
FROM
postgresql(
'localhost:5432',
'postgres_database',
'postgres_table',
'user',
'password'
);Мы можем направить результат этого запроса в файл с помощью INTO OUTFILE. Используйте FORMAT, чтобы указать формат создаваемого файла. Давайте выгрузим всё содержимое таблицы PostgreSQL в файл Parquet:
./clickhouse local -q "SELECT * FROM
postgresql(
'localhost:5432',
'postgres_database',
'postgres_table',
'user',
'password'
)
INTO OUTFILE 'my_output_file.parquet'"Экспорт PostgreSQL в CSV
Всё то же, что и для Parquet, только для выходного файла мы указываем более подходящее имя:
./clickhouse local -q "SELECT * FROM
postgresql(
'localhost:5432',
'postgres_database',
'postgres_table',
'user',
'password'
)
INTO OUTFILE 'my_output_file.csv'"Вот и всё! ClickHouse распознаёт расширение .csv в имени выходного файла и выводит данные в формате CSV. В остальном это та же самая команда, что и выше.
Экспорт из PostgreSQL в JSON
Чтобы экспортировать данные из PostgreSQL в JSON, достаточно изменить имя файла, и ClickHouse сам определит формат:
./clickhouse local -q "SELECT * FROM
postgresql(
'localhost:5432',
'postgres_database',
'postgres_table',
'user',
'password'
)
INTO OUTFILE 'my_output_file.ndjson'"Потоковая передача PostgreSQL в другой процесс
Вместо INTO OUTFILE можно передавать результаты табличной функции в другой процесс в виде потока. Вот простой пример, демонстрирующий синтаксис: мы подсчитываем количество строк с помощью команды Linux wc -l:
./clickhouse local -q "SELECT *
FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/house_parquet/house_0.parquet'
FORMAT JSONEachRow
)" | wc -lОднако мы можем без труда передавать эти строки в shell-скрипт, скрипт на Python или любой другой нужный вам процесс.