본문 바로가기
NIFI

nifi updaterecord로 oracle nvl, ms coalesce 함수 사용하기

by kyeongseo.oh 2022. 3. 4.

nifi updaterecord로 특정 column의 값이 null 일 경우 다른 값으로 대체하는 작업을 수행해봄

 

또한 "yyyy-MM-ddTHH:mm:ssZ" format의 문자열을 yyyy-MM-dd HH:mm:ss로 변환하고 9시간을 더해봄

 

apache nifi 1.9.2와 cloudera cfm nifi 1.13.2 버전에서 테스트하였음.

 

GenerateFlowFile을 사용해 테스트 데이터를 생성함.

a,b
2022-03-03T08:15:00Z,testString
2022-03-03T08:15:00Z,

apache nifi 1.9.2

apache nifi 1.9.2에서는 coalesce function을 지원하지 않는 것으로 파악된다.

결국 UpdateRecord를 2번 쓰는 방법으로 coalesce를 구현함

뭔가 더 좋은 방법이 있을 것 같지만 나중에 시간날 때 고민해봐야겠음

 

전체 flow

  • GenerateFlowFile

테스트 데이터를 생성함.

 

  • UpdateRecord

Replacement Value Strategy을 Record Path Value로 함

Replacement Value Strategy Record Path Value
/test /b

b 칼럼과 동일한 값을 가진 test라는 칼럼을 추가하였음

 

  • UpdateRecord
Replacement Value Strategy Literal Value
/test ${field.value:isEmpty():not():ifElse(${field.value},${literal("empty")})}
/a ${field.value:toDate("yyyy-MM-dd'T'HH:mm:ss'Z'"):plus(32400000):format("yyyy-MM-dd HH:mm:ss")}

 

${field.value:isEmpty():not():ifElse(${field.value},${literal("empty")})}는 test 칼럼의 value가 비어있지 않으면 ${field.value} 즉 기존에 가지고 있던 값을 그대로 넣고, 비어있으면 empty라는 문자로 value를 대체한다는 의미이다.

 

${field.value:toDate("yyyy-MM-dd'T'HH:mm:ss'Z'"):plus(32400000):format("yyyy-MM-dd HH:mm:ss")}는

"yyyy-MM-dd'T'HH:mm:ss'Z'" 형태의 문자를 date type으로 인식시킨 후 9시간을 더해 "yyyy-MM-dd HH:mm:ss" format으로 변환한다는 의미이다.

 

최종적으로 테스트 데이터가 다음과 같이 변환되었음

a,b,test
2022-03-03 17:15:00,testString,testString
2022-03-03 17:15:00,,empty

 


cloudera cfm nifi 1.13.2

coalesce function을 지원하므로 해당 function을 사용한다. 

 

전체 flow

  • GenerateFlowFile

테스트 데이터를 생성함.

 

  • QueryRecord
query select a, b, COALESCE(b,'empty') as c from flowfile

COALESCE function을 사용해 b 칼럼의 값이 비어있으면 empty 문자열로 대체하고, 비어있지 않으면 b 칼럼의 값을

넣는다.

 

  • UpdateRecord
Replacement Value Strategy Literal Value
/a ${field.value:toDate("yyyy-MM-dd'T'HH:mm:ss'Z'"):plus(32400000):format("yyyy-MM-dd HH:mm:ss")}

 

${field.value:toDate("yyyy-MM-dd'T'HH:mm:ss'Z'"):plus(32400000):format("yyyy-MM-dd HH:mm:ss")}는

"yyyy-MM-dd'T'HH:mm:ss'Z'" 형태의 문자를 date type으로 인식시킨 후 9시간을 더해 "yyyy-MM-dd HH:mm:ss" format으로 변환한다는 의미이다.

 

timestamp 변환도 QueryRecord에서 한번에 하는 게 가장 깔끔할 것 같은데, 시간 될 때 ansi sql로 timestamp 형변환하고 시간 더하는 걸 테스트해보고 추가적으로 테스트 해봐야할 것 같음

 

최종적으로 테스트 데이터가 다음과 같이 변환되었음

a,b,test
2022-03-03 17:15:00,testString,testString
2022-03-03 17:15:00,,empty

 

댓글