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

더 알아보기 (Learn more)