PutSQL ... [Cloudera][JDBC](11660) Query returns a ResultSet when a row count is expected 가 난다. PutSQL 은 executeUpdate() 로 갱신 행 수를 기대하는데 Impala 의 COMPUTE STATS 는 결과 집합을 돌려주기 때문이다. ExecuteSQL 도 드라이버에 따라 실패할 수 있다.
ExecuteScript(Groovy) 에서 Statement.execute() 를 쓰면 반환 형태와 무관하게 실행된다.
import java.sql.*
def conn = context.controllerServiceLookup.getControllerService('<dbcp-service-id>').getConnection()
def flowFile = session.get()
try {
def stmt = conn.createStatement()
stmt.execute("COMPUTE INCREMENTAL STATS ${flowFile?.getAttribute('tablename')}")
stmt.close()
if (flowFile) session.transfer(flowFile, REL_SUCCESS)
} catch (Exception e) {
log.error("COMPUTE STATS 실패", e)
if (flowFile) session.transfer(flowFile, REL_FAILURE)
} finally {
conn.close()
}
큰 테이블은 COMPUTE INCREMENTAL STATS 가 빠르다. 오래 걸리는 통계 계산은 프로세서 실행 시간 제한에 걸리지 않도록 스케줄을 잡는다.