Sangwon
07/20/2026, 5:54 AMRocky
07/20/2026, 5:54 AMINSERT INTO FILES() 방식입니다.
1. INSERT INTO FILES (가장 추천)
데이터를 조회하여 바로 S3의 특정 경로에 파일로 저장합니다. Parquet, ORC, CSV 형식을 지원하며 사용법이 매우 간단합니다.
sql
INSERT INTO FILES (
"path" = "<s3://your-bucket/dump/path/data_>",
"format" = "parquet", -- 또는 "csv", "orc"
"compression" = "lz4", -- 압축 방식 선택
"aws.s3.access_key" = "xxxx",
"aws.s3.secret_key" = "xxxx",
"aws.s3.region" = "ap-northeast-2"
)
SELECT * FROM internal_catalog.db_name.table_name;
* 특징: SELECT 문을 자유롭게 사용하여 특정 조건의 데이터만 추출하거나 컬럼을 가공해서 덤프를 뜰 수 있습니다.
* 버전: v3.1 이상 (CSV는 v3.3 이상 권장)
2. EXPORT 구문
전통적인 방식으로, 비동기 작업을 생성하여 테이블 데이터를 S3로 내보냅니다.
sql
EXPORT TABLE internal_catalog.db_name.table_name
TO "<s3://your-bucket/dump/path/>"
PROPERTIES (
"format" = "csv",
"column_separator" = ","
)
WITH BROKER (
"aws.s3.access_key" = "xxxx",
"aws.s3.secret_key" = "xxxx",
"aws.s3.region" = "ap-northeast-2"
);
* 특징: 백그라운드에서 작업이 실행되므로 대용량 데이터 덤프에 적합합니다. SHOW EXPORT; 명령어로 진행 상황을 확인할 수 있습니다.
참고사항
* Shared-data 모드 관련: 만약 StarRocks를 Shared-data(Cloud-native) 모드로 사용 중이시라면, 내부 데이터가 이미 S3에 저장되어 있지만 이는 StarRocks 전용 포맷(세그먼트 파일)입니다. 따라서 외부 서비스(Spark, Hive 등)에서 읽으려면 위와 같이 표준 포맷(Parquet/CSV)으로 다시 내보내야 합니다.
* 권한: 데이터를 내보내려는 S3 버킷에 대해 쓰기(Write) 권한이 있는 IAM Key 또는 Role이 필요합니다.
References
• loading/s3.md
• unloading/unload_using_insert_into_files.mdSangwon
07/20/2026, 5:55 AMRocky
07/20/2026, 5:56 AMEXPORT 명령은 공식적으로 *CSV 형식만 지원*합니다 (Parquet 형식은 EXPORT 구문에서는 아직 지원 예정 단계입니다).
따라서 데이터를 *Parquet 형식으로 S3에 덤프(Unload)*하려면, v3.2부터 도입된 INSERT INTO FILES() 구문을 사용해야 합니다. 이 방식이 현재 StarRocks에서 권장하는 표준 Parquet 덤프 방법입니다.
Parquet 형식으로 S3 덤프 예시 (INSERT INTO FILES)
이 명령은 SELECT 결과를 지정한 S3 경로에 Parquet 파일로 즉시 저장합니다.
sql
INSERT INTO FILES (
"path" = "<s3://your-bucket-name/dump/my_table_data/>",
"format" = "parquet", -- 파일 형식 지정 (parquet)
"compression" = "snappy", -- 압축 방식 (snappy, lz4, zstd, gzip 등)
"aws.s3.access_key" = "YOUR_AK",
"aws.s3.secret_key" = "YOUR_SK",
"aws.s3.region" = "ap-northeast-2",
"parquet.use_legacy_encoding" = "false" -- 필요 시 설정
)
SELECT * FROM internal_catalog.your_db.your_table;
주요 특징
1. 형식 지정: `"format" = "parquet"`을 통해 Parquet로 출력함을 명시합니다.
2. 비동기 처리: `EXPORT`와 달리 `INSERT INTO FILES`는 일반 쿼리처럼 실행됩니다. 만약 대용량 데이터를 비동기로 처리하고 싶다면 별도의 클라이언트(예: Airflow, 스크립트)에서 실행하거나, `INSERT INTO FILES`를 지원하는 최신 버전의 기능을 활용하십시오.
3. 경로: path 마지막에 `/`를 붙이면 해당 디렉토리 안에 여러 개의 Parquet 파일이 생성됩니다. `/data_`와 같이 접두어를 붙이면 파일명이 해당 접두어로 시작합니다.
요약
* EXPORT TABLE: CSV만 가능.
* INSERT INTO FILES: Parquet, ORC, CSV 가능 (권장 방식).
만약 반드시 EXPORT 구문을 사용해야 하는 상황(비동기 작업 ID가 꼭 필요한 경우 등)이라면 현재는 CSV 포맷으로만 가능함을 유의해 주세요.
References
• loading/loading_introduction/feature-support-loading-and-unloading.md
• sql-reference/sql-statements/loading_unloading/unloading/EXPORT.md
• unloading/unload_using_insert_into_files.md
References
• sql-reference/sql-statements/loading_unloading/unloading/EXPORT.md
• sql-reference/sql-functions/table-functions/files.md
• data_source/catalog/hive_catalog.md
• loading/Spark-connector-starrocks.mdSangwon
07/20/2026, 7:01 AMRocky
07/20/2026, 7:01 AMSELECT 문만으로 즉시 데이터를 조회할 수 있습니다.
1. FILES() 함수로 직접 조회 (가장 간편)
v3.1부터 지원되는 이 방식은 S3 경로와 파일 정보를 쿼리에 직접 입력하여 데이터를 읽습니다.
sql
SELECT * FROM FILES(
"path" = "<s3://your-bucket/path/to/your_data.csv>",
"format" = "csv",
"column_separator" = ",", -- 구분자 (기본값은 ,)
"row_delimiter" = "\n", -- 줄 바꿈 기호
"header" = "true", -- 첫 번째 줄이 컬럼명인 경우 true
"aws.s3.access_key" = "YOUR_AK",
"aws.s3.secret_key" = "YOUR_SK",
"aws.s3.region" = "ap-northeast-2"
);
2. External Table 생성 (자주 읽을 때)
매번 S3 정보를 입력하기 번거롭다면, S3의 파일을 참조하는 *외부 테이블*을 만들어 두고 일반 테이블처럼 조회할 수 있습니다.
sql
CREATE EXTERNAL TABLE ext_csv_table (
id INT,
name STRING,
age INT
)
ENGINE=FILE
PROPERTIES (
"path" = "<s3://your-bucket/path/to/folder/>", -- 폴더 단위 지정 가능
"format" = "csv",
"column_separator" = ",",
"aws.s3.access_key" = "YOUR_AK",
"aws.s3.secret_key" = "YOUR_SK",
"aws.s3.region" = "ap-northeast-2"
);
-- 생성 후 일반 테이블처럼 조회
SELECT * FROM ext_csv_table WHERE id > 10;
3. CSV 읽을 때 주요 옵션
CSV는 정형화된 형식이 아니므로 아래 옵션들을 상황에 맞게 설정해야 정확하게 읽을 수 있습니다.
* column_separator: 컬럼 구분자. (예: ,, \t, |)
* row_delimiter: 행 구분자. (일반적으로 \n)
* header: `true`로 설정하면 첫 번째 행을 데이터가 아닌 컬럼 헤더로 인식하여 건너뜁니다.
* trim_space: 컬럼 값 앞뒤의 공백을 제거할지 여부 ("true" 또는 "false").
* enclosed_by: 데이터가 큰따옴표(") 등으로 감싸져 있는 경우 사용합니다 (예: "enclosed_by" = '"').
참고: 스키마 자동 추론
FILES() 함수를 사용할 때 스키마를 모르겠다면, `DESC FUNCTION FILES(...)`를 실행하여 StarRocks가 추론한 데이터 타입을 미리 확인할 수도 있습니다.
References
• sql-reference/sql-functions/table-functions/files.md
• loading/s3.md
• data_source/file_external_table.mdSangwon
07/20/2026, 7:03 AMRocky
07/20/2026, 7:04 AMcsv. 접두어)
FILES() 테이블 함수를 사용하신다면, 그냥 `"column_separator"`가 아니라 반드시 *`"csv.column_separator"`*라고 작성해야 합니다. (csv. 접두어가 붙어야 함)
* 잘못된 예: "column_separator" = ","
* 올바른 예: "csv.column_separator" = ","
2. 이스케이프(Escape) 및 특수 문자 처리
탭(\t)이나 줄 바꿈(\n) 같은 보이지 않는 문자를 구분자로 사용할 경우, MySQL 클라이언트와 StarRocks 서버 사이의 이스케이프 처리를 위해 역슬래시를 두 번(\\) 써야 할 때가 많습니다.
* 탭(Tab)인 경우: "csv.column_separator" = "\\\\t"
* 특수 제어 문자(예: Hive 기본 구분자 \x01)인 경우: "csv.column_separator" = "\\\\x01"
3. 행 구분자(row_delimiter) 문제
데이터의 행이 제대로 끊기지 않으면 첫 번째 줄의 구분자만 찾다가 실패할 수 있습니다. 특히 Windows 형식의 줄 바꿈(\r\n)인 경우 명시해주는 것이 좋습니다.
* 예: "csv.row_delimiter" = "\\\\r\\\\n"
──────────
해결을 위한 체크리스트 예시 (FILES 함수 기준)
만약 쉼표(,)로 구분된 CSV 파일이라면 아래와 같이 작성해 보세요.
sql
SELECT * FROM FILES(
"path" = "<s3://your-bucket/data.csv>",
"format" = "csv",
"csv.column_separator" = ",", -- 반드시 'csv.' 접두어 확인
"csv.row_delimiter" = "\n", -- 행 구분자 확인
"csv.skip_header" = "1", -- 첫 줄이 헤더면 필수
"aws.s3.access_key" = "...",
"aws.s3.secret_key" = "...",
"aws.s3.region" = "..."
);
팁: 만약 여전히 안 된다면, `DESC FUNCTION FILES(...)`를 실행하여 StarRocks가 현재 설정으로 컬럼을 어떻게 인식하고 있는지(하나의 STRING으로 보는지 여러 개로 보는지) 먼저 확인해 보시기 바랍니다.
References
• sql-reference/sql-functions/table-functions/files.md
• sql-reference/sql-statements/loading_unloading/STREAM_LOAD.md
References
• sql-reference/sql-functions/table-functions/files.mdSangwon
07/20/2026, 7:11 AMRocky
07/20/2026, 7:11 AMFILES() 함수로 폴더 내의 여러 파일을 한 번에 읽으려면, 경로 끝에 *와일드카드(*)*를 붙여주어야 합니다. 단순히 폴더 경로만 입력하면 해당 경로를 하나의 파일로 인식하려고 시도하기 때문에 에러가 발생할 수 있습니다.
*해결 방법: 경로 끝에 * 추가*
폴더 내의 모든 파일을 읽고 싶다면 다음과 같이 작성하세요.
sql
SELECT * FROM FILES(
"path" = "<s3://your-bucket/your-folder/*>", -- 폴더 내 모든 파일
-- 또는 "path" = "<s3://your-bucket/your-folder/*.csv>", -- 특정 확장자만
"format" = "csv",
"csv.column_separator" = ",",
"aws.s3.access_key" = "...",
"aws.s3.secret_key" = "...",
"aws.s3.region" = "..."
);
주의사항 및 체크리스트
1. 하위 폴더까지 읽기: 만약 폴더 안에 또 다른 하위 폴더가 있고 그 안의 파일까지 읽어야 한다면, 현재 `FILES()`의 데이터 읽기 모드에서는 경로 패턴을 `"s3://bucket/folder/**/_"`와 같이 지정하거나 각 뎁스에 맞춰 `_`를 사용해야 할 수 있습니다.
2. 동일한 스키마: 폴더 내의 모든 파일은 *동일한 컬럼 구조(스키마)*를 가지고 있어야 합니다. 만약 파일마다 컬럼 개수가 다르거나 데이터 타입이 다르면 읽기 과정에서 에러가 발생합니다.
3. 불필요한 파일 제외: 폴더 안에 _SUCCESS 같은 메타데이터 파일이나 로그 파일이 섞여 있으면, StarRocks가 이를 CSV 데이터로 읽으려다 실패합니다. 이 경우 *.csv 처럼 확장자를 명시하여 데이터 파일만 필터링하세요.
에러 메시지가 구체적으로 어떻게 나오나요?
만약 위 방법으로도 해결되지 않는다면, 발생하는 에러 메시지를 알려주시면 더 정확한 원인을 파악해 드릴 수 있습니다. (예: Access Denied, Not a directory, Schema mismatch 등)
References
• sql-reference/sql-functions/table-functions/files.md
• loading/s3.md
References
• sql-reference/sql-functions/table-functions/files.md