CSV 포맷
CSV 포맷 (CSV Format)
CSV 포맷은 CSV 스키마를 기반으로 CSV 데이터를 읽고 쓸 수 있게 해줘요. 현재 CSV 스키마는 테이블 스키마에서 파생(derive)돼요.
출처: 문서
본문
의존성 (Dependencies)
CSV 포맷을 사용하려면 빌드 자동화 도구(Maven이나 SBT 같은)를 사용하는 프로젝트와 SQL JAR 번들을 사용하는 SQL Client 양쪽 모두에서 아래와 같은 의존성이 필요해요.
| Maven dependency | SQL Client |
|---|---|
org.apache.flink : flink-csv : 2.3.0 |
Built-in |
CSV 포맷으로 테이블 생성하기
다음은 Kafka 커넥터와 CSV 포맷을 사용해 테이블을 만드는 예시예요.
CREATE TABLE user_behavior (
user_id BIGINT,
item_id BIGINT,
category_id BIGINT,
behavior STRING,
ts TIMESTAMP(3)
) WITH (
'connector' = 'kafka',
'topic' = 'user_behavior',
'properties.bootstrap.servers' = 'localhost:9092',
'properties.group.id' = 'testGroup',
'format' = 'csv',
'csv.ignore-parse-errors' = 'true',
'csv.allow-comments' = 'true'
)
포맷 옵션 (Format Options)
| 옵션(Option) | 필수 | 전달(Forwarded) | 기본값(Default) | 타입(Type) | 설명(Description) |
|---|---|---|---|---|---|
| format | required | no | (none) | String | 어떤 포맷을 사용할지 지정해요. 여기서는 'csv'를 사용해야 해요. |
| csv.field-delimiter | optional | yes | , |
String | 필드 구분자 문자예요(기본값 ','). 반드시 단일 문자여야 해요. 백슬래시로 특수 문자를 지정할 수 있어요. 예: '\t'는 탭 문자를 나타내요. 또한 일반 SQL에서 유니코드로 지정할 수도 있어요. 예: 'csv.field-delimiter' = U&'\0001'은 0x01 문자를 나타내요. |
| csv.disable-quote-character | optional | yes | false | Boolean | 필드 값을 감싸는 따옴표 문자를 비활성화해요(기본값 false). true로 설정하면 'csv.quote-character' 옵션을 설정할 수 없어요. |
| csv.quote-character | optional | yes | " |
String | 필드 값을 감싸는 따옴표 문자예요(기본값 "). |
| csv.allow-comments | optional | yes | false | Boolean | '#'로 시작하는 주석 줄을 무시해요(기본값 비활성화). 활성화하면 빈 행을 허용하도록 파싱 오류도 함께 무시해야 해요. |
| csv.ignore-parse-errors | optional | no | false | Boolean | 실패하는 대신 파싱 오류가 있는 필드와 행을 건너뛰어요. 오류 시 필드는 null로 설정돼요. |
| csv.array-element-delimiter | optional | yes | ; |
String | 배열과 행 요소 값을 구분하는 배열 요소 구분자 문자열이에요(기본값 ';'). |
| csv.escape-character | optional | yes | (none) | String | 값을 이스케이프하기 위한 이스케이프 문자예요(기본값 비활성화). |
| csv.null-literal | optional | yes | (none) | String | null 값으로 해석되는 null 리터럴 문자열이에요(기본값 비활성화). |
| csv.write-bigdecimal-in-scientific-notation | optional | yes | true | Boolean | BigDecimal 데이터 타입을 과학적 표기법으로 표현할지 여부를 활성화해요(기본값 true). 예를 들어 100000은 기본적으로 1E+5로 인코딩되며, 이 옵션을 false로 설정하면 100000으로 작성돼요. 참고: 값이 0이 아니면서 10의 배수인 경우에만 과학적 표기법으로 변환돼요. |
| csv.trim-spaces | optional | yes | false | Boolean | 따옴표로 감싸지 않은 필드 값의 앞뒤 공백을 제거할지 여부를 나타내는 선택적 플래그예요(기본값 비활성화). 역직렬화(deserialization)에만 영향을 줘요. |
| csv.ignore-trailing-unmappable | optional | yes | false | Boolean | 스키마에 매핑할 수 없는 추가적인 뒤쪽 필드를 무시할지 여부를 나타내는 선택적 플래그예요(기본값 비활성화). 역직렬화에만 영향을 줘요. |
| csv.allow-trailing-comma | optional | yes | true | Boolean | 마지막 필드 값 뒤의 후행(trailing) 콤마를 허용할지 여부를 나타내는 선택적 플래그예요(기본값 활성화). 역직렬화에만 영향을 줘요. |
| csv.fail-on-missing-columns | optional | yes | false | Boolean | 행이 스키마가 기대하는 것보다 적은 컬럼을 가질 때 실패할지 여부를 나타내는 선택적 플래그예요(기본값 비활성화). 역직렬화에만 영향을 줘요. |
| csv.empty-string-as-null | optional | yes | false | Boolean | 빈 문자열 값을 null로 취급할지 여부를 나타내는 선택적 플래그예요(기본값 비활성화). 역직렬화에만 영향을 줘요. |
데이터 타입 매핑 (Data Type Mapping)
현재 CSV 스키마는 항상 테이블 스키마에서 파생돼요. CSV 스키마를 명시적으로 정의하는 것은 아직 지원되지 않아요.
Flink CSV 포맷은 jackson databind API를 사용해 CSV 문자열을 파싱하고 생성해요.
다음 표는 Flink 타입에서 CSV 타입으로의 매핑을 보여줘요.
| Flink SQL type | CSV type |
|---|---|
CHAR / VARCHAR / STRING |
string |
BOOLEAN |
boolean |
BINARY / VARBINARY |
string with encoding: base64 |
DECIMAL |
number |
TINYINT |
number |
SMALLINT |
number |
INT |
number |
BIGINT |
number |
FLOAT |
number |
DOUBLE |
number |
DATE |
string with format: date |
TIME |
string with format: time |
TIMESTAMP |
string with format: date-time |
INTERVAL |
number |
ARRAY |
array |
ROW |
object |