티스토리 뷰

반응형

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까지만 지원하는게 문제다.

 

https://github.com/apache/flink/blob/release-1.15.0/flink-formats/flink-avro/src/main/java/org/apache/flink/formats/avro/typeutils/AvroSchemaConverter.java#L355-L363

결국 코드를 안고치고 다루려면, 참고로 날짜의 정밀도 값의 경우 다음과 같은 형태이기 때문에, microseconds 값을 milliseconds 로 변환해서 사용할 수 밖에 없다. (1000을 나눈값을 사용해서 워터마크로 지정)

  • TIMESTAMP(p)
    • p = 0 : sec
    • p = 3 : milliseconds
    • p = 6 : microseconds

덤으로 epoch 숫자값의 단위가 어떤건지 잘 모를땐 아래 사이트에서 변환해보면 좀더 쉽게 알 수 있다.

https://www.epochconverter.com/

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함