Raw 포맷
Raw 포맷 (Raw Format)
Raw 포맷은 (바이트 기반) 원시 값을 단일 열로 읽고 쓸 수 있게 해줍니다. 이 포맷은 내장되어 있어 추가 의존성이 필요하지 않습니다.
출처: 문서
본문
이 포맷은 직렬화 스키마(Serialization Schema) 와 역직렬화 스키마(Deserialization Schema) 로 사용할 수 있습니다.
Raw 포맷은 (바이트 기반) 원시 값을 단일 열로 읽고 쓸 수 있게 해줍니다.
참고: 이 포맷은
null값을byte[]타입의null로 인코딩합니다. 이는upsert-kafka에서 사용될 때 제약이 있을 수 있습니다.upsert-kafka는null값을 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 로 직렬화된 바이트 시퀀스. |