SELECT INTO OUTFILE 文を使用すると、ApsaraDB for SelectDB のクエリ結果をリモートストレージ(Object Storage Service (OSS) または Hadoop 分散ファイルシステム (HDFS))にエクスポートできます。これは、データバックアップやデータ移行を目的としています。
仕組み
エクスポート対象のデータを定義する
SELECTクエリを作成します。OSS または HDFS 上の宛先パスを指定し、出力フォーマットおよびプロパティを設定します。
文を実行します。SelectDB はクエリを実行し、結果を宛先に単一の同期操作で書き込みます。
返された行のファイル数、行数、ファイルサイズを確認して、正常終了を確認します。
注意事項
同期実行と結果の整合性
SELECT INTO OUTFILE は同期処理です。この文は、エクスポートが完了するか失敗するまで応答を返しません。エクスポート中に接続が切断された場合、ステータスは返されず、エクスポートが正常に完了したかどうかを判断できません。
エクスポートの成功を確実に確認するには、"success_file_name" = "SUCCESS" を PROPERTIES 句に追加してください。エクスポートが成功すると、SelectDB は出力ディレクトリに SUCCESS という名前のマーカーファイルを書き込みます。
シングルスレッド実行
デフォルトでは、エクスポートは単一の BE ノード上で 1 スレッドで実行されます。エクスポートの所要時間は、クエリ実行時間と結果セットの書き込み時間の合計となります:
総所要時間 = クエリ実行時間 + 結果書き込み時間大規模なデータセットの場合、エクスポート実行前にタイムアウト値を延長してください:
SET query_timeout = <秒数>;セッション変数についての詳細については、「変数の管理」をご参照ください。
ファイルパスおよび上書き動作
SELECT INTO OUTFILE は、宛先パスや既存のファイルの存在をチェックしません。また、パスを自動的に作成したり、既存のファイルを上書きしたりすることもありません。パスの作成および上書き動作は、リモートストレージシステム(OSS または HDFS)によって制御されます。
ファイル管理の責任
SelectDB はエクスポートされたファイルを管理しません。正常終了したジョブの出力ファイルおよび失敗したジョブの残存ファイルは、ストレージシステム内で直接クリーンアップしてください。
サポートされるファイル形式
| データの型 | サポートされる形式 |
|---|---|
| 基本型 | CSV、CSV_WITH_NAMES、CSV_WITH_NAMES_AND_TYPES、Parquet、ORC(Optimized Row Columnar) |
| 複合型(ARRAY、MAP、STRUCT) | CSV、CSV_WITH_NAMES、CSV_WITH_NAMES_AND_TYPES、ORC |
| ネストされたデータ | 非対応 |
特殊な出力値
BITMAP および HyperLogLog(HLL)関数: 出力に非表示文字が含まれる場合、代わりに
\N(NULL を示す)が返されます。地理空間関数: 出力はバイナリ形式でエンコードされます。
ST_AsTextを使用すると、読み取り可能なテキスト形式で取得できます。影響を受ける関数:ST_CIRCLE、ST_POINT、ST_POLYGON、ST_GEOMETRYFROMTEXT、ST_LINEFROMTEXT、ST_GEOMETRYFROMWKB。
結果ファイルの動作
空の結果セットでも出力ファイルが生成されます。
セグメントファイルは常に完全な行を含むため、実際のファイルサイズは
max_file_sizeと若干異なる場合があります。
制限事項
SELECT INTO OUTFILE は、Amazon Simple Storage Service(Amazon S3)プロトコルおよび HDFS プロトコルのみをサポートしています。
構文
query_stmt
INTO OUTFILE "file_path"
[FORMAT AS format_name]
[PROPERTIES ("key"="value", ...)]パラメーター
| パラメーター | 必須 | 説明 |
|---|---|---|
query_stmt | はい | SELECT 文で、エクスポート対象のデータを定義します。 |
file_path | はい | 宛先パスおよび任意のファイル名プレフィックス。プレフィックスを省略するとディレクトリのみが使用されます(例:"hdfs://path/to/")。 |
FORMAT AS | いいえ | 出力フォーマット。選択肢: CSV(デフォルト)、CSV_WITH_NAMES、CSV_WITH_NAMES_AND_TYPES、PARQUET、ORC。 |
PROPERTIES | いいえ | ファイル、HDFS、または S3 のプロパティ。詳細については、「ファイルプロパティ」、「HDFS プロパティ」、および「S3 プロパティ」をご参照ください。 |
ファイル命名規則
file_path にプレフィックスが含まれている場合(例:"s3://bucket_name/to/my_file_")、出力ファイルは以下のパターンで命名されます:
<プレフィックス><インスタンス名>_<シーケンス>.csvシーケンス番号は
0から始まり、各セグメントファイルごとに増分されます。単一の出力ファイルの場合、シーケンス番号は省略されます。
デフォルトの拡張子は
.csvです。file_suffixを使用して上書きできます。
例: プレフィックス my_file_ および FORMAT AS CSV を指定した場合、マルチファイルエクスポートでは以下のようなファイルが生成されます:
my_file_abcdefg_0.csv
my_file_abcdefg_1.csv
my_file_abcdefg_2.csv
...ファイルプロパティ
| プロパティ | 必須 | 説明 |
|---|---|---|
column_separator | いいえ | 列区切り文字。CSV 形式でのみ適用されます。 |
line_delimiter | いいえ | 行区切り文字。CSV 形式でのみ適用されます。 |
max_file_size | いいえ | セグメントファイルごとの最大サイズ。有効範囲:5 MB~2 GB。デフォルト:1 GB。ORC ファイルの場合、実際のサイズは ceil(max_file_size / 64) × 64 MB になります。 |
delete_existing_files | いいえ | エクスポート前に宛先ディレクトリ内のすべてのファイルを削除するかどうかを指定します。false(デフォルト):既存のファイルを削除せずにエクスポートします。true:宛先ディレクトリ内のすべてのファイルおよびサブディレクトリを事前に削除します。 |
success_file_name | いいえ | エクスポート成功後に宛先ディレクトリに書き込まれるマーカーファイルの名前(例:"SUCCESS")。接続が切断される可能性がある場合に、エクスポート完了を確認するために使用します。 |
file_suffix | いいえ | 出力ファイルの拡張子。デフォルトの拡張子を上書きします。 |
delete_existing_files = true はデータを恒久的に削除します。この設定はテスト環境でのみ使用してください。有効化するには、Alibaba Cloud テクニカルサポートへチケットを送信し、enable_delete_existing_files = true を fe.conf に設定したうえでフロントエンドを再起動してください。
`delete_existing_files` のスコープ例:
"file_path" = "/user/tmp"—/user/配下のすべてのファイルおよびディレクトリを削除します。"file_path" = "/user/tmp/"—/user/tmp/配下のすべてのファイルおよびディレクトリを削除します。
HDFS プロパティ
HDFS を介したエクスポートを行う場合、以下のプロパティを指定する必要があります。
| プロパティ | 必須 | 説明 |
|---|---|---|
fs.defaultFS | はい | NameNode のエンドポイントおよびポート。 |
hadoop.username | はい | HDFS 認証用のユーザー名。 |
dfs.nameservices | はい | Name Service 名。これは hdfs-site.xml の値と一致している必要があります。 |
dfs.ha.namenodes.[nameservice ID] | はい | Name Service 内の NameNode ID。これは hdfs-site.xml の値と一致している必要があります。 |
dfs.namenode.rpc-address.[nameservice ID].[name node ID] | はい | 各 NameNode の RPC(Remote Procedure Call)アドレス。これは hdfs-site.xml の値と一致している必要があります。 |
dfs.client.failover.proxy.provider.[nameservice ID] | はい | アクティブな NameNode のフェールオーバーに使用する Java クラス。デフォルト値:org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider。 |
Kerberos 認証(有効な場合)
| プロパティ | 必須 | 説明 |
|---|---|---|
dfs.namenode.kerberos.principal | はい | HDFS NameNode の Kerberos プリンシパル名。 |
hadoop.security.authentication | はい | 認証方式。値を kerberos に設定します。 |
hadoop.kerberos.principal | はい | Kerberos 認証用のプリンシパル。 |
hadoop.kerberos.keytab | はい | Kerberos キータブファイルへのパス。 |
S3 プロパティ
これらのプロパティは、S3 プロトコルをサポートするあらゆるストレージシステム(OSS を含む)に適用されます。
| プロパティ | 必須 | 説明 |
|---|---|---|
s3.endpoint | はい | 宛先ストレージシステムのエンドポイント。 |
s3.access_key | はい | 認証用のアクセスキー。 |
s3.secret_key | はい | 認証用のシークレットキー。 |
s3.region | はい | 宛先ストレージシステムのリージョン。 |
s3.session_token | 一時的な認証情報を使用する場合 | 一時セッション認証用のセッショントークン。 |
use_path_style | いいえ | アクセススタイル。デフォルト:false(仮想ホストスタイル)。仮想ホストスタイルをサポートしないストレージシステムに対して、パススタイルアクセスを強制する場合は true に設定します。 |
URI スキーム: http://、https://、または s3:// を file_path で使用します。
http://またはhttps://:use_path_styleによりアクセススタイルが決定されます。s3://:use_path_styleの設定に関わらず、常に仮想ホストスタイルを使用します。
宛先 URL には、必ず URI スキーム(http://、https://、または s3://)を含めてください。スキームを省略すると、以下のエラーが発生します:ERROR 1105 (HY000): errCode = 2, detailMessage = Unknown properties: [s3.region, s3.endpoint, s3.secret_key, s3.access_key]。
応答
SELECT INTO OUTFILE は同期処理です。文の実行が完了すると、エクスポートスレッドごとに 1 行の応答が返されます。
正常終了時の応答:
SELECT * FROM tbl1 LIMIT 10 INTO OUTFILE "file:///home/work/path/result_";+------------+-----------+----------+--------------------------------------------------------------------+
| ファイル番号 | 合計行数 | ファイルサイズ | URL |
+------------+-----------+----------+--------------------------------------------------------------------+
| 1 | 3 | 7 | file:///192.168.1.10/home/work/path/result_{fragment_instance_id}_ |
| 1 | 2 | 4 | file:///192.168.1.11/home/work/path/result_{fragment_instance_id}_ |
+------------+-----------+----------+--------------------------------------------------------------------+
2 行が取得されました (2.218 秒)| フィールド | 説明 |
|---|---|
FileNumber | 生成されたファイル数。 |
TotalRows | 結果セットの行数。 |
FileSize | エクスポートされたファイルの合計サイズ(バイト単位)。 |
URL | データがローカルディスクにエクスポートされた場合の、データが書き込まれたコンピュートノード。 |
並列エクスポート時の応答(スレッドごとに 1 行、複数行):
+------------+-----------+----------+--------------------------------------------------------------------+
| ファイル数 | 合計行数 | ファイルサイズ | URL |
+------------+-----------+----------+--------------------------------------------------------------------+
| 1 | 3 | 7 | file:///192.168.1.10/home/work/path/result_{fragment_instance_id}_ |
| 1 | 2 | 4 | file:///192.168.1.11/home/work/path/result_{fragment_instance_id}_ |
+------------+-----------+----------+--------------------------------------------------------------------+
2 行が返されました(2.218 秒)エラー応答:
ERROR 1064 (HY000): errCode = 2, detailMessage = ...並列エクスポートの有効化
デフォルトでは、エクスポートは単一の BE ノードスレッドで実行されます。並列エクスポートを有効化すると、ワークロードを複数の BE ノードに分散できます。
ステップ 1:セッション変数を有効化します。
SET enable_parallel_outfile = true;ステップ 2:クエリが並列エクスポートをサポートしているか確認します。
EXPLAIN を使用して、SELECT INTO OUTFILE 文を解析します:
EXPLAIN <select_into_outfile_statement>;出力を確認します:
並列エクスポートがサポートされている場合:
RESULT FILE SINKがPLAN FRAGMENT 1に表示されます。並列エクスポートがサポートされていない場合:
RESULT FILE SINKがPLAN FRAGMENT 0に表示されます。
ORDER BYを含むクエリは、enable_parallel_outfile = trueであっても並列実行できません。これは、並べ替えにはシングルスレッドによるマージステップが必要であるためです。
並列エクスポートがサポートされるクエリプランの例:
+-----------------------------------------------------------------------------+
| 実行計画文字列 |
+-----------------------------------------------------------------------------+
| PLAN FRAGMENT 0 |
| OUTPUT EXPRS:<slot 2> | <slot 3> | <slot 4> | <slot 5> |
| PARTITION: UNPARTITIONED |
| |
| RESULT SINK |
| |
| 1:EXCHANGE |
| |
| PLAN FRAGMENT 1 |
| OUTPUT EXPRS:`k1` + `k2` |
| PARTITION: HASH_PARTITIONED: `default_cluster:test`.`multi_tablet`.`k1` |
| |
| RESULT FILE SINK |
| FILE PATH: s3://ml-bd-repo/bpit_test/outfile_1951_ |
| STORAGE TYPE: S3 |
| |
| 0:OlapScanNode |
| TABLE: multi_tablet |
+-----------------------------------------------------------------------------+ステップ 3:最大同時実行数の算出(任意)
並列エクスポートがサポートされている場合、同時実行可能な最大リクエスト数は以下のとおりです:
be_instance_num × parallel_fragment_exec_instance_numbe_instance_num:BE ノード数。32 コア以下のクラスターでは 1 ノード、32 コア以上のクラスターでは、各ノードが 32 コアとなる複数ノードが使用されます。parallel_fragment_exec_instance_num:ノードごとの並列度設定。
現在の並列度設定を確認するには:
SHOW VARIABLES LIKE '%parallel_fragment_exec_instance_num%';設定するには:
SET parallel_fragment_exec_instance_num = <値>;例
HDFS へのエクスポート
必要な HDFS プロパティは、Hadoop クラスターで高可用性(HA)が有効になっているかどうかによって異なります。
高可用性(HA)が無効な Hadoop クラスター
-- fileSystem_port のデフォルト値:9000
SELECT * FROM tbl
INTO OUTFILE "hdfs://${host}:${fileSystem_port}/path/to/result_"
FORMAT AS CSV
PROPERTIES
(
"fs.defaultFS" = "hdfs://ip:port",
"hadoop.username" = "work"
);高可用性(HA)が有効な Hadoop クラスター
-- fileSystem_port のデフォルト値:8020
SELECT * FROM tbl
INTO OUTFILE "hdfs:///path/to/result_"
FORMAT AS CSV
PROPERTIES
(
"fs.defaultFS" = "hdfs://hacluster/",
"dfs.nameservices" = "hacluster",
"dfs.ha.namenodes.hacluster" = "n1,n2",
"dfs.namenode.rpc-address.hacluster.n1" = "192.168.0.1:8020",
"dfs.namenode.rpc-address.hacluster.n2" = "192.168.0.2:8020",
"dfs.client.failover.proxy.provider.hacluster" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
);結果の合計サイズが 1 GB 以下の場合、SelectDB は単一のファイル result_0.csv を書き込みます。合計サイズが 1 GB を超える場合、複数のセグメントファイル(result_0.csv、result_1.csv など)が書き込まれます。
S3 プロトコル経由での OSS へのエクスポート
中国(杭州)リージョンの OSS バケットに、UNION クエリの結果を Parquet 形式でエクスポートします:
SELECT k1 FROM tbl1 UNION SELECT k2 FROM tbl1
INTO OUTFILE "s3://oss-bucket/result_"
FORMAT AS PARQUET
PROPERTIES
(
"s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
"s3.access_key" = "****",
"s3.secret_key" = "****",
"s3.region" = "cn-hangzhou"
);並列エクスポートを有効化した OSS へのエクスポート
データを並列でエクスポートします。すべてのリクエストで enable_parallel_outfile セッション変数が使用されます。
SET enable_parallel_outfile = true;
SELECT k1 FROM tb1 LIMIT 1000
INTO OUTFILE "s3://my_bucket/export/my_file_"
FORMAT AS CSV
PROPERTIES
(
"s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
"s3.access_key" = "****",
"s3.secret_key" = "****",
"s3.region" = "cn-hangzhou"
);クエリに ORDER BY が含まれる場合、enable_parallel_outfile = true であっても、並列エクスポートは自動的に無効になります:
SET enable_parallel_outfile = true;
SELECT k1 FROM tb1 ORDER BY k1 LIMIT 1000
INTO OUTFILE "s3://my_bucket/export/my_file_"
FORMAT AS CSV
PROPERTIES
(
"s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
"s3.access_key" = "****",
"s3.secret_key" = "****",
"s3.region" = "cn-hangzhou"
);データの型のマッピング
Parquet または ORC へのエクスポート時に、SelectDB はデータの型を、各ファイル形式でサポートされる型に自動的にマッピングします。
SelectDB から ORC へのマッピング
| SelectDB の型 | ORC の型 |
|---|---|
| BOOLEAN | BOOLEAN |
| TINYINT | TINYINT |
| SMALLINT | SMALLINT |
| INT | INT |
| BIGINT | BIGINT |
| LARGEINT | STRING |
| DATE | STRING |
| DATEV2 | STRING |
| DATETIME | STRING |
| DATETIMEV2 | TIMESTAMP |
| FLOAT | FLOAT |
| DOUBLE | DOUBLE |
| CHAR / VARCHAR / STRING | STRING |
| DECIMAL | DECIMAL |
| STRUCT | STRUCT |
| MAP | MAP |
| ARRAY | ARRAY |
SelectDB から Parquet へのマッピング(Apache Arrow 経由)
Parquet エクスポートでは、データが Apache Arrow を経由してルーティングされます。SelectDB の型はまず Arrow の型にマッピングされ、その後 Arrow が Parquet に書き込みます。
| SelectDB の型 | Apache Arrow の型 |
|---|---|
| BOOLEAN | BOOLEAN |
| TINYINT | INT8 |
| SMALLINT | INT16 |
| INT | INT32 |
| BIGINT | INT64 |
| LARGEINT | UTF8 |
| DATE | UTF8 |
| DATEV2 | UTF8 |
| DATETIME | UTF8 |
| DATETIMEV2 | UTF8 |
| FLOAT | FLOAT32 |
| DOUBLE | FLOAT64 |
| CHAR / VARCHAR / STRING | UTF8 |
| DECIMAL | DECIMAL128 |
| STRUCT | STRUCT |
| MAP | MAP |
| ARRAY | LIST |