Перейти к основному содержимому

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

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

Начиная с версии 1.5.0, 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 с включенным простым методом аутентификации.
  • Корзину 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.
INSERT INTO FILES(
'path' = 'file:///home/ubuntu/parquetfile/',
'format' = 'parquet'
)
SELECT * FROM sales_records;

См. также