All Products
Search
Document Center

ApsaraDB for SelectDB:SELECT\ INTO\ OUTFILE

Last Updated:Mar 28, 2026

Gunakan pernyataan SELECT INTO OUTFILE untuk mengekspor hasil kueri dari ApsaraDB for SelectDB ke penyimpanan remote—Object Storage Service (OSS) atau Hadoop Distributed File System (HDFS)—guna pencadangan atau migrasi data.

Cara kerja

  1. Tulis kueri SELECT untuk menentukan data yang akan diekspor.

  2. Tentukan jalur tujuan di OSS atau HDFS serta atur format dan properti output.

  3. Jalankan pernyataan tersebut. SelectDB mengeksekusi kueri dan menulis hasilnya ke tujuan dalam satu operasi sinkron.

  4. Periksa baris yang dikembalikan untuk memverifikasi jumlah file, jumlah baris, dan ukuran file sebagai konfirmasi keberhasilan.

Catatan penggunaan

Eksekusi sinkron dan integritas hasil

SELECT INTO OUTFILE bersifat sinkron. Pernyataan hanya mengembalikan respons setelah ekspor selesai—atau gagal. Jika koneksi terputus selama ekspor, tidak ada status yang dikembalikan dan Anda tidak dapat memastikan apakah ekspor telah selesai.

Untuk mengonfirmasi keberhasilan ekspor secara andal, tambahkan "success_file_name" = "SUCCESS" ke klausa PROPERTIES. Saat ekspor berhasil, SelectDB menulis file penanda bernama SUCCESS ke direktori output.

Eksekusi single-threaded

Secara default, ekspor menggunakan satu thread pada satu node BE. Durasi ekspor sama dengan waktu eksekusi kueri ditambah waktu penulisan set hasil:

Durasi total = Waktu eksekusi kueri + Waktu penulisan hasil

Untuk dataset besar, perpanjang timeout sebelum menjalankan ekspor:

SET query_timeout = <seconds>;

Untuk detail tentang variabel sesi, lihat Variable management.

Jalur file dan perilaku overwrite

SELECT INTO OUTFILE tidak memeriksa apakah jalur tujuan atau file sudah ada. Pernyataan ini tidak membuat jalur secara otomatis atau menimpa file yang sudah ada. Pembuatan jalur dan perilaku overwrite dikendalikan oleh sistem penyimpanan remote (OSS atau HDFS).

Tanggung jawab manajemen file

SelectDB tidak mengelola file yang diekspor. Bersihkan file output dari pekerjaan yang berhasil dan file sisa dari pekerjaan yang gagal langsung di sistem penyimpanan Anda.

Format file yang didukung

Tipe dataFormat yang didukung
Tipe dasarCSV, CSV_WITH_NAMES, CSV_WITH_NAMES_AND_TYPES, Parquet, ORC (Optimized Row Columnar)
Tipe kompleks (ARRAY, MAP, STRUCT)CSV, CSV_WITH_NAMES, CSV_WITH_NAMES_AND_TYPES, ORC
Data bersarangTidak didukung

Nilai output khusus

  • Fungsi BITMAP dan HyperLogLog (HLL): Jika output berisi karakter tak terlihat, \N dikembalikan sebagai gantinya (menunjukkan null).

  • Fungsi geospasial: Output berupa biner terenkripsi. Gunakan ST_AsText untuk mendapatkan teks yang dapat dibaca. Fungsi yang terpengaruh: ST_CIRCLE, ST_POINT, ST_POLYGON, ST_GEOMETRYFROMTEXT, ST_LINEFROMTEXT, ST_GEOMETRYFROMWKB.

Perilaku file hasil

  • Set hasil kosong tetap menghasilkan file output.

  • File segmen selalu berisi baris lengkap, sehingga ukuran file aktual mungkin sedikit berbeda dari max_file_size.

Batasan

SELECT INTO OUTFILE hanya mendukung protokol Amazon Simple Storage Service (Amazon S3) dan protokol HDFS.

Sintaks

query_stmt
INTO OUTFILE "file_path"
[FORMAT AS format_name]
[PROPERTIES ("key"="value", ...)]

Parameter

ParameterWajibDeskripsi
query_stmtYaPernyataan SELECT yang menentukan data yang akan diekspor.
file_pathYaJalur tujuan dan awalan nama file opsional. Abaikan awalan untuk hanya menggunakan direktori, misalnya "hdfs://path/to/".
FORMAT ASTidakFormat output. Opsi: CSV (default), CSV_WITH_NAMES, CSV_WITH_NAMES_AND_TYPES, PARQUET, ORC.
PROPERTIESTidakProperti file, HDFS, atau S3. Lihat File properties, HDFS properties, dan S3 properties.

Pemberian nama file

Ketika file_path mencakup awalan (misalnya "s3://bucket_name/to/my_file_"), file output diberi nama mengikuti pola berikut:

<awalan><nama-instans>_<urutan>.csv
  • Nomor urutan dimulai dari 0 dan bertambah untuk setiap file segmen.

  • Untuk satu file output, nomor urutan dihilangkan.

  • Ekstensi default adalah .csv. Ganti dengan file_suffix.

Contoh: Dengan awalan my_file_ dan FORMAT AS CSV, ekspor multi-file menghasilkan:

my_file_abcdefg_0.csv
my_file_abcdefg_1.csv
my_file_abcdefg_2.csv
...

Properti file

PropertiWajibDeskripsi
column_separatorTidakPemisah kolom. Hanya berlaku untuk format CSV.
line_delimiterTidakPemisah baris. Hanya berlaku untuk format CSV.
max_file_sizeTidakUkuran maksimum per file segmen. Rentang valid: 5 MB–2 GB. Default: 1 GB. Untuk file ORC, ukuran aktual adalah ceil(max_file_size / 64) × 64 MB.
delete_existing_filesTidakApakah akan menghapus semua file di direktori tujuan sebelum mengekspor. false (default): ekspor tanpa menghapus file yang ada. true: hapus semua file dan subdirektori di direktori tujuan terlebih dahulu.
success_file_nameTidakNama file penanda yang ditulis ke direktori tujuan setelah ekspor berhasil, misalnya "SUCCESS". Gunakan ini untuk mengonfirmasi penyelesaian ekspor ketika koneksi mungkin terputus.
file_suffixTidakEkstensi file untuk file output. Menggantikan ekstensi default.
Peringatan

delete_existing_files = true menghapus data secara permanen. Gunakan pengaturan ini hanya di lingkungan pengujian. Untuk mengaktifkannya, ajukan tiket ke dukungan teknis Alibaba Cloud agar mengatur enable_delete_existing_files = true di fe.conf dan restart frontend.

Contoh cakupan `delete_existing_files`:

  • "file_path" = "/user/tmp" — menghapus semua file dan direktori di bawah /user/.

  • "file_path" = "/user/tmp/" — menghapus semua file dan direktori di bawah /user/tmp/.

Properti HDFS

Properti berikut wajib saat mengekspor melalui HDFS.

PropertiWajibDeskripsi
fs.defaultFSYaTitik akhir dan port NameNode.
hadoop.usernameYaUsername untuk autentikasi HDFS.
dfs.nameservicesYaNama layanan. Harus sesuai dengan nilai dalam hdfs-site.xml.
dfs.ha.namenodes.[ID nameservice]YaID NameNode dalam Name Service. Harus sesuai dengan hdfs-site.xml.
dfs.namenode.rpc-address.[ID nameservice].[ID name node]YaAlamat Remote Procedure Call (RPC) untuk setiap NameNode. Harus sesuai dengan hdfs-site.xml.
dfs.client.failover.proxy.provider.[ID nameservice]YaKelas Java untuk failover NameNode aktif. Default: org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider.

Otentikasi Kerberos (jika diaktifkan)

PropertiWajibDeskripsi
dfs.namenode.kerberos.principalYaNama principal Kerberos dari NameNode HDFS.
hadoop.security.authenticationYaMetode autentikasi. Atur ke kerberos.
hadoop.kerberos.principalYaPrincipal untuk otentikasi Kerberos.
hadoop.kerberos.keytabYaJalur ke file Kerberos keytab.

Properti S3

Properti ini berlaku untuk sistem penyimpanan apa pun yang mendukung protokol S3, termasuk OSS.

PropertiWajibDeskripsi
s3.endpointYaTitik akhir sistem penyimpanan tujuan.
s3.access_keyYaKunci akses untuk autentikasi.
s3.secret_keyYaKunci rahasia untuk autentikasi.
s3.regionYaWilayah sistem penyimpanan tujuan.
s3.session_tokenJika menggunakan kredensial temporaryToken sesi untuk autentikasi sesi temporary.
use_path_styleTidakGaya akses. Default: false (gaya virtual-hosted). Atur ke true untuk memaksa akses gaya path pada sistem penyimpanan yang tidak mendukung gaya virtual-hosted.

Skema URI: Gunakan http://, https://, atau s3:// di file_path.

  • http:// atau https://: use_path_style menentukan gaya akses.

  • s3://: selalu menggunakan gaya virtual-hosted, terlepas dari use_path_style.

Penting

Sertakan selalu skema URI (http://, https://, atau s3://) di URL tujuan. Menghilangkan skema menyebabkan error: ERROR 1105 (HY000): errCode = 2, detailMessage = Unknown properties: [s3.region, s3.endpoint, s3.secret_key, s3.access_key].

Respons

SELECT INTO OUTFILE bersifat sinkron. Saat pernyataan selesai, respons berupa satu baris per thread ekspor.

Respons sukses:

SELECT * FROM tbl1 LIMIT 10 INTO OUTFILE "file:///home/work/path/result_";
+------------+-----------+----------+--------------------------------------------------------------------+
| FileNumber | TotalRows | FileSize | 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 baris dalam set (2,218 dtk)
FieldDeskripsi
FileNumberJumlah file yang dihasilkan.
TotalRowsJumlah baris dalam set hasil.
FileSizeUkuran total file yang diekspor, dalam byte.
URLNode komputasi tempat data diekspor jika data diekspor ke disk lokal.

Respons ekspor paralel (beberapa baris, satu per thread):

+------------+-----------+----------+--------------------------------------------------------------------+
| FileNumber | TotalRows | FileSize | 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 rows in set (2.218 sec)

Respons error:

ERROR 1064 (HY000): errCode = 2, detailMessage = ...

Aktifkan ekspor paralel

Secara default, ekspor berjalan pada satu thread node BE. Aktifkan ekspor paralel untuk mendistribusikan beban kerja ke beberapa node BE.

Langkah 1: Aktifkan variabel sesi.

SET enable_parallel_outfile = true;

Langkah 2: Verifikasi bahwa kueri Anda mendukung ekspor paralel.

Jalankan EXPLAIN pada pernyataan SELECT INTO OUTFILE Anda:

EXPLAIN <select_into_outfile_statement>;

Periksa output:

  • Ekspor paralel didukung: RESULT FILE SINK muncul di PLAN FRAGMENT 1.

  • Ekspor paralel tidak didukung: RESULT FILE SINK muncul di PLAN FRAGMENT 0.

Kueri dengan ORDER BY tidak dapat berjalan secara paralel meskipun enable_parallel_outfile = true, karena pengurutan memerlukan langkah merge single-threaded.

Contoh rencana kueri (ekspor paralel didukung):

+-----------------------------------------------------------------------------+
| Explain String                                                              |
+-----------------------------------------------------------------------------+
| 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                                                    |
+-----------------------------------------------------------------------------+

Langkah 3: Hitung konkurensi maksimum (opsional).

Saat ekspor paralel didukung, jumlah maksimum permintaan konkuren adalah:

be_instance_num × parallel_fragment_exec_instance_num
  • be_instance_num: jumlah node BE. Kluster dengan hingga 32 core CPU menggunakan 1 node; kluster dengan minimal 32 core CPU menggunakan beberapa node, masing-masing dengan 32 core CPU.

  • parallel_fragment_exec_instance_num: pengaturan paralelisme per node.

Untuk melihat pengaturan paralelisme saat ini:

SHOW VARIABLES LIKE '%parallel_fragment_exec_instance_num%';

Untuk mengaturnya:

SET parallel_fragment_exec_instance_num = <value>;

Contoh

Ekspor ke HDFS

Properti HDFS yang diperlukan berbeda tergantung pada apakah high availability (HA) diaktifkan untuk kluster Hadoop.

Kluster Hadoop tanpa high availability

-- fileSystem_port default: 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"
);

Kluster Hadoop dengan high availability

-- fileSystem_port default: 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"
);

Jika total hasil ≤ 1 GB, SelectDB menulis satu file: result_0.csv. Jika total melebihi 1 GB, SelectDB menulis beberapa file segmen: result_0.csv, result_1.csv, dan seterusnya.

Ekspor ke OSS melalui protokol S3

Ekspor hasil kueri UNION ke format Parquet dalam bucket OSS di wilayah China (Hangzhou):

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"
);

Ekspor ke OSS dengan ekspor paralel diaktifkan

Ekspor data secara paralel. Semua permintaan menggunakan variabel sesi 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"
);

Jika kueri mencakup ORDER BY, ekspor paralel dinonaktifkan secara otomatis meskipun 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"
);

Pemetaan tipe data

Saat mengekspor ke Parquet atau ORC, SelectDB secara otomatis memetakan tipe datanya ke format yang didukung oleh masing-masing jenis file.

SelectDB ke ORC

Jenis SelectDBTipe ORC
BOOLEANBOOLEAN
TINYINTTINYINT
SMALLINTSMALLINT
INTINT
BIGINTBIGINT
LARGEINTSTRING
DATESTRING
DATEV2STRING
DATETIMESTRING
DATETIMEV2TIMESTAMP
FLOATFLOAT
DOUBLEDOUBLE
CHAR / VARCHAR / STRINGSTRING
DECIMALDECIMAL
STRUCTSTRUCT
MAPMAP
ARRAYARRAY

SelectDB ke Parquet (melalui Apache Arrow)

Ekspor Parquet mengarahkan data melalui Apache Arrow. Tipe data SelectDB dipetakan ke tipe Arrow terlebih dahulu, lalu Arrow menuliskannya ke Parquet.

Tipe SelectDBTipe Apache Arrow
BOOLEANBOOLEAN
TINYINTINT8
SMALLINTINT16
INTINT32
BIGINTINT64
LARGEINTUTF8
DATEUTF8
DATEV2UTF8
DATETIMEUTF8
DATETIMEV2UTF8
FLOATFLOAT32
DOUBLEFLOAT64
CHAR / VARCHAR / STRINGUTF8
DECIMALDECIMAL128
STRUCTSTRUCT
MAPMAP
ARRAYLIST