Raw 포맷

Raw 포맷 (Raw Format)

Raw 포맷은 (바이트 기반) 원시 값을 단일 열로 읽고 쓸 수 있게 해줍니다. 이 포맷은 내장되어 있어 추가 의존성이 필요하지 않습니다.

출처: 문서

본문

이 포맷은 직렬화 스키마(Serialization Schema)역직렬화 스키마(Deserialization Schema) 로 사용할 수 있습니다.

Raw 포맷은 (바이트 기반) 원시 값을 단일 열로 읽고 쓸 수 있게 해줍니다.

참고: 이 포맷은 null 값을 byte[] 타입의 null 로 인코딩합니다. 이는 upsert-kafka 에서 사용될 때 제약이 있을 수 있습니다. upsert-kafkanull 값을 tombstone 메시지(키에 대한 DELETE)로 취급하기 때문입니다. 따라서 필드가 null 값을 가질 수 있다면 upsert-kafka 커넥터와 raw 포맷을 value.format 으로 함께 사용하는 것을 피할 것을 권장합니다.

Raw 커넥터는 내장되어 있으며 추가 의존성이 필요하지 않습니다.

예제

예를 들어 Kafka 에 다음과 같은 raw 로그 데이터가 있고 Flink SQL 을 사용해 이 데이터를 읽고 분석하고 싶을 수 있습니다:

47.29.201.179 - - [28/Feb/2019:13:17:10 +0000] "GET /?p=1 HTTP/2.0" 200 5316 "https://domain.com/?p=1" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36" "2.75"

다음은 raw 포맷을 사용해 기반 Kafka 토픽에서 UTF-8 인코딩의 익명 문자열 값으로 읽고(쓸 수도 있고) 테이블을 만드는 방법입니다:

CREATE TABLE nginx_log (
  log STRING
) WITH (
  'connector' = 'kafka',
  'topic' = 'nginx_log',
  'properties.bootstrap.servers' = 'localhost:9092',
  'properties.group.id' = 'testGroup',
  'format' = 'raw'
)

그런 다음 raw 데이터를 순수 문자열로 읽고, 사용자 정의 함수(예제의 my_split 같은)를 사용해 여러 필드로 분할해 추가로 분석할 수 있습니다:

SELECT t.hostname, t.datetime, t.url, t.browser, ...
FROM(
  SELECT my_split(log) as t FROM nginx_log
);

반대로 STRING 타입의 단일 열을 이 Kafka 토픽에 UTF-8 인코딩의 익명 문자열 값으로 쓸 수도 있습니다.

포맷 옵션 (Format Options)

옵션 필수 기본값 유형 설명
format required (none) String 사용할 포맷을 지정합니다. 여기서는 'raw' 여야 합니다.
raw.charset optional UTF-8 String 텍스트 문자열을 인코딩할 문자셋을 지정합니다.
raw.endianness optional big-endian String 숫자 값의 바이트를 인코딩할 엔디언(endianness)을 지정합니다. 유효한 값은 'big-endian' 과 'little-endian' 입니다. endianness 자세한 내용.

데이터 타입 매핑 (Data Type Mapping)

아래 표는 이 포맷이 지원하는 SQL 타입을 자세히 보여줍니다:

Flink SQL 타입
CHAR / VARCHAR / STRING (기본적으로) UTF-8 로 인코딩된 텍스트 문자열. 인코딩 문자셋은 'raw.charset' 으로 구성할 수 있습니다.
BINARY / VARBINARY / BYTES 바이트 시퀀스 자체.
BOOLEAN boolean 값을 나타내는 단일 바이트, 0 은 false, 1 은 true.
TINYINT 부호 있는 숫자 값의 단일 바이트.
SMALLINT (기본적으로) big-endian 인코딩의 2바이트. 엔디언은 'raw.endianness' 로 구성할 수 있습니다.
INT (기본적으로) big-endian 인코딩의 4바이트. 엔디언은 'raw.endianness' 로 구성할 수 있습니다.
BIGINT (기본적으로) big-endian 인코딩의 8바이트. 엔디언은 'raw.endianness' 로 구성할 수 있습니다.
FLOAT IEEE 754 형식과 (기본적으로) big-endian 인코딩의 4바이트. 엔디언은 'raw.endianness' 로 구성할 수 있습니다.
DOUBLE IEEE 754 형식과 (기본적으로) big-endian 인코딩의 8바이트. 엔디언은 'raw.endianness' 로 구성할 수 있습니다.
RAW RAW 타입의 기반 TypeSerializer 로 직렬화된 바이트 시퀀스.

더 알아보기 (Learn more)