Перейти к основному содержимому
Версия: 2.0.x

Выгрузка данных с помощью INSERT INTO FILES

В этом разделе описывается, как выгружать данные из Selena в удалённое хранилище с помощью INSERT INTO FILES.

Начиная с версии v1.5.2, Selena поддерживает использование табличной функции FILES() для определения записываемого файла в удалённом хранилище. Затем вы можете объединить FILES() с командой INSERT для выгрузки данных из Selena в ваше удалённое хранилище.

По сравнению с другими методами экспорта данных, поддерживаемыми Selena, выгрузка данных с помощью INSERT INTO FILES обеспечивает более унифицированный и простой в использовании интерфейс. Вы можете выгружать данные непосредственно в удалённое хранилище, используя тот же синтаксис, который вы использовали для загрузки данных из него. Более того, этот метод поддерживает хранение файлов данных в разных путях хранилища путём извлечения значений указанного столбца, что позволяет управлять экспортированными данными в партиционированной структуре.

ПРИМЕЧАНИЕ

Обратите внимание, что выгрузка данных с помощью INSERT INTO FILES не поддерживает прямой экспорт данных в локальные файловые системы. Однако вы можете экспортировать данные в локальные файлы с помощью NFS. См. Выгрузка в локальные файлы с помощью NFS.

Подготовка

В следующем примере создаётся база данных unload и таблица sales_records в качестве объектов данных, которые могут быть использованы в последующем руководстве. Вы можете использовать свои собственные данные.

CREATE DATABASE unload;
USE unload;
CREATE TABLE sales_records(
record_id BIGINT,
seller STRING,
store_id INT,
sales_time DATETIME,
sales_amt DOUBLE
)
DUPLICATE KEY(record_id)
PARTITION BY date_trunc('day', sales_time)
DISTRIBUTED BY HASH(record_id);

INSERT INTO sales_records
VALUES
(220313001,"Amy",1,"2022-03-13 12:00:00",8573.25),
(220314002,"Bob",2,"2022-03-14 12:00:00",6948.99),
(220314003,"Amy",1,"2022-03-14 12:00:00",4319.01),
(220315004,"Carl",3,"2022-03-15 12:00:00",8734.26),
(220316005,"Carl",3,"2022-03-16 12:00:00",4212.69),
(220317006,"Bob",2,"2022-03-17 12:00:00",9515.88);

Таблица sales_records содержит ID транзакции record_id, продавца seller, ID магазина store_id, время sales_time и сумму продажи sales_amt для каждой транзакции. Она партиционирована на ежедневной основе в соответствии с sales_time.

Вам также необходимо подготовить систему удалённого хранилища с доступом на запись. Следующие примеры экспортируют данные в следующие удалённые хранилища:

  • Кластер HDFS с включённым простым методом аутентификации.
  • Bucket AWS S3, использующий учётные данные IAM User.

Подробнее о системах удалённого хранилища и методах учётных данных, поддерживаемых FILES(), см. Справочник SQL - FILES().

Выгрузка данных

INSERT INTO FILES поддерживает выгрузку данных в один файл или несколько файлов. Вы можете дополнительно партиционировать эти файлы данных, указав для них отдельные пути хранения.

При выгрузке данных с помощью INSERT INTO FILES вы должны вручную установить алгоритм сжатия, используя свойство compression. Для получения дополнительной информации об алгоритмах сжатия данных, поддерживаемых FILES, см. unload_data_param.

Выгрузка данных в несколько файлов

По умолчанию INSERT INTO FILES выгружает данные в несколько файлов данных, каждый размером 1 ГБ. Вы можете настроить размер файла с помощью свойства target_max_file_size (единица измерения: байты).

Следующий пример выгружает все строки данных в sales_records в виде нескольких файлов Parquet с префиксом data1. Размер каждого файла составляет 1 КБ.

примечание

Здесь установка target_max_file_size в 1 КБ используется для демонстрации выгрузки в несколько файлов с небольшим набором данных. В производственной среде настоятельно рекомендуется устанавливать это значение в диапазоне от сотен МБ до нескольких ГБ.

  • В S3:
INSERT INTO
FILES(
"path" = "s3://mybucket/unload/data1",
"format" = "parquet",
"compression" = "uncompressed",
"target_max_file_size" = "1024", -- 1KB
"aws.s3.access_key" = "xxxxxxxxxx",
"aws.s3.secret_key" = "yyyyyyyyyy",
"aws.s3.region" = "us-west-2"
)
SELECT * FROM sales_records;
  • В HDFS:
INSERT INTO
FILES(
"path" = "hdfs://xxx.xx.xxx.xx:9000/unload/data1",
"format" = "parquet",
"compression" = "uncompressed",
"target_max_file_size" = "1024", -- 1KB
"hadoop.security.authentication" = "simple",
"username" = "xxxxx",
"password" = "xxxxx"
)
SELECT * FROM sales_records;

Выгрузка данных в несколько файлов по разным путям

Вы также можете партиционировать файлы данных в разных путях хранения, извлекая значения указанного столбца с помощью свойства partition_by.

Следующий пример выгружает все строки данных в sales_records в виде нескольких файлов Parquet по пути /unload/partitioned/. Эти файлы хранятся в разных подпапках, различаемых по значениям в столбце sales_time.

  • В S3:
INSERT INTO
FILES(
"path" = "s3://mybucket/unload/partitioned/",
"format" = "parquet",
"compression" = "lz4",
"partition_by" = "sales_time",
"aws.s3.access_key" = "xxxxxxxxxx",
"aws.s3.secret_key" = "yyyyyyyyyy",
"aws.s3.region" = "us-west-2"
)
SELECT * FROM sales_records;
  • В HDFS:
INSERT INTO
FILES(
"path" = "hdfs://xxx.xx.xxx.xx:9000/unload/partitioned/",
"format" = "parquet",
"compression" = "lz4",
"partition_by" = "sales_time",
"hadoop.security.authentication" = "simple",
"username" = "xxxxx",
"password" = "xxxxx"
)
SELECT * FROM sales_records;

Выгрузка данных в один файл

Чтобы выгрузить данные в один файл данных, необходимо указать свойство single как true.

Следующий пример выгружает все строки данных в sales_records в виде одного файла Parquet с префиксом data2.

  • В S3:
INSERT INTO
FILES(
"path" = "s3://mybucket/unload/data2",
"format" = "parquet",
"compression" = "lz4",
"single" = "true",
"aws.s3.access_key" = "xxxxxxxxxx",
"aws.s3.secret_key" = "yyyyyyyyyy",
"aws.s3.region" = "us-west-2"
)
SELECT * FROM sales_records;
  • В HDFS:
INSERT INTO
FILES(
"path" = "hdfs://xxx.xx.xxx.xx:9000/unload/data2",
"format" = "parquet",
"compression" = "lz4",
"single" = "true",
"hadoop.security.authentication" = "simple",
"username" = "xxxxx",
"password" = "xxxxx"
)
SELECT * FROM sales_records;

Выгрузка в MinIO

Параметры, используемые для MinIO, отличаются от тех, которые используются для AWS S3.

Пример:

INSERT INTO
FILES(
"path" = "s3://huditest/unload/data3",
"format" = "parquet",
"compression" = "zstd",
"single" = "true",
"aws.s3.access_key" = "xxxxxxxxxx",
"aws.s3.secret_key" = "yyyyyyyyyy",
"aws.s3.region" = "us-west-2",
"aws.s3.use_instance_profile" = "false",
"aws.s3.enable_ssl" = "false",
"aws.s3.enable_path_style_access" = "true",
"aws.s3.endpoint" = "http://minio:9000"
)
SELECT * FROM sales_records;

Выгрузка в локальные файлы с помощью NFS

Для доступа к файлам в NFS через протокол file:// необходимо смонтировать NAS-устройство как NFS в одной и той же директории на каждом узле BE или CN.

Пример:

-- Выгрузка данных в CSV файлы.
INSERT INTO FILES(
'path' = 'file:///home/ubuntu/csvfile/',
'format' = 'csv',
'csv.column_separator' = ',',
'csv.row_delimitor' = '\n'
)
SELECT * FROM sales_records;

-- Выгрузка данных в Parquet файлы с версией Parquet 1.0.
INSERT INTO FILES(
'path' = 'file:///home/ubuntu/parquetfile/',
'format' = 'parquet',
'parquet.version' = '1.0'
)
SELECT * FROM sales_records;

См. также