티스토리 뷰
반응형
Flink 에서 Window 단위로 데이터를 다루려면 워터마크를 지정해야하고, 워터마크를 지정하기위해서 TO_TIMESTAMP_LTZ 함수를 써서 날짜타입으로 전환해서 사용해야 하는 경우가 종종 있다. 보통 EpochTime 이 들어있는 필드를 쓴다면 아래와 같은 형태로 워터마크를 선언하려고 할것이다.
CREATE TABLE source_table {
...
rowtime AS TO_TIMESTAMP_LTZ(logTime, 6), // logTime 의 단위는 microsec
WATERMARK FOR rowtime AS rowtime
} WITH {
...
};
그리고, 원본의 logTime 필드의 값이 microsec 이라서 정밀도값을 6으로 지정하면 다음과 같은 오류가 발생한다.
org.apache.flink.table.api.TableException: The precision value '6' for function TO_TIMESTAMP_LTZ(numeric, precision) is unsupported, the supported value is '0' for second or '3' for millisecond.
왜 그럴까?
우선 시간관련해서 p 값의 숫자 (6, 9 이런거) 는 정밀도를 의미한다. 그런데 아래 코드를 보면, Avro 포맷에서 TIMESTAMP_WITHOUT_TIME_ZONE 의 경우 정밀도가 3까지만 지원하는게 문제다.
결국 코드를 안고치고 다루려면, 참고로 날짜의 정밀도 값의 경우 다음과 같은 형태이기 때문에, microseconds 값을 milliseconds 로 변환해서 사용할 수 밖에 없다. (1000을 나눈값을 사용해서 워터마크로 지정)
- TIMESTAMP(p)
- p = 0 : sec
- p = 3 : milliseconds
- p = 6 : microseconds
덤으로 epoch 숫자값의 단위가 어떤건지 잘 모를땐 아래 사이트에서 변환해보면 좀더 쉽게 알 수 있다.
반응형
'데이터처리 > Flink' 카테고리의 다른 글
댓글