ExecuteSQL 프로세서

ExecuteSQL 프로세서

Snowflake Openflow의 ExecuteSQL 프로세서에 대한 문서예요. 제공된 SQL select 쿼리를 실행하고, 그 결과를 Avro 형식으로 변환하는 프로세서예요. 스트리밍을 사용하기 때문에 임의로 큰 결과 집합을 지원해요.

출처: Snowflake 문서

본문

기능 — 일반 제공(Generally Available)

Openflow Snowflake 배포는 AWS, Azure, GCP 상용(Commercial) 리전의 모든 계정에서 사용할 수 있어요. Openflow BYOC 배포는 AWS 상용(Commercial) 리전의 모든 계정에서 사용할 수 있어요.

번들(Bundle)

org.apache.nifi | nifi-standard-nar

설명(Description)

제공된 SQL select 쿼리를 실행해요. 쿼리 결과는 Avro 형식으로 변환돼요. 스트리밍을 사용하므로 임의로 큰 결과 집합을 지원해요. 이 프로세서는 표준 스케줄링 방법을 따라 타이머나 cron 표현식으로 실행하도록 예약할 수 있고, 들어오는 FlowFile로 트리거할 수도 있어요. 들어오는 FlowFile로 트리거되면 select 쿼리를 평가할 때 그 FlowFile의 속성을 사용할 수 있으며, 쿼리는 ? 를 사용해 매개변수를 이스케이프할 수 있어요. 이 경우 사용할 매개변수는 sql.args.N.type과 sql.args.N.value라는 명명 규칙의 FlowFile 속성으로 존재해야 해요(N은 양의 정수). sql.args.N.type은 JDBC Type을 나타내는 숫자여야 해요. FlowFile의 콘텐츠는 UTF-8 형식일 것으로 예상돼요. FlowFile 속성 'executesql.row.count'는 선택된 행 수를 나타내요.

태그(Tags)

database, jdbc, query, select, sql

입력 요구사항(Input Requirement)

ALLOWED

민감 동적 속성 지원(Supports Sensitive Dynamic Properties)

true

속성(Properties)

속성(Property) 설명(Description)
Content Output Strategy 입력 FlowFile을 처리할 때 FlowFile 콘텐츠를 기록하는 전략을 지정해요. 이 전략은 결과를 생성하지 않는 쿼리를 처리할 때 적용돼요.
Database Connection Pooling Service 데이터베이스에 연결을 얻는 데 사용하는 Controller Service예요.
Default Decimal Precision DECIMAL/NUMBER 값을 'decimal' Avro 논리 유형으로 기록할 때 사용 가능한 자릿수를 나타내는 특정 'precision'이 필요해요. 일반적으로 precision은 열 데이터 유형 정의나 데이터베이스 엔진 기본값으로 정의돼요. 하지만 일부 데이터베이스 엔진은 정의되지 않은 precision(0)을 반환할 수 있어요. 'Default Decimal Precision'은 그런 정의되지 않은 precision 숫자를 기록할 때 사용돼요.
Default Decimal Scale DECIMAL/NUMBER 값을 'decimal' Avro 논리 유형으로 기록할 때 사용 가능한 소수 자릿수를 나타내는 특정 'scale'이 필요해요. 일반적으로 scale은 열 데이터 유형 정의나 데이터베이스 엔진 기본값으로 정의돼요. 하지만 정의되지 않은 precision(0)이 반환되면 일부 데이터베이스 엔진에서는 scale도 불확실할 수 있어요. 'Default Decimal Scale'은 그런 정의되지 않은 숫자를 기록할 때 사용돼요. 값이 지정된 scale보다 많은 소수 자릿수를 가지면 반올림되는데, 예를 들어 1.53은 scale 0에서 2가 되고 1.5는 scale 1에서 그대로예요.
Max Wait Time 실행 중인 SQL select 쿼리에 허용되는 최대 시간이에요. 0이면 제한이 없어요. 1초 미만의 최대 시간은 0과 같아요.
Normalize Table and Column Names 열 이름의 Avro 호환 불가 문자를 Avro 호환 문자로 바꿀지 여부예요. 예를 들어 유효한 Avro 레코드를 만들기 위해 콜론과 마침표를 밑줄로 바꿔요.
SQL Query 실행할 SQL 쿼리예요. 쿼리는 비어 있거나, 상수 값이거나, Expression Language를 사용해 속성에서 만들 수 있어요. 이 속성이 지정되면 들어오는 FlowFile의 콘텐츠와 무관하게 사용돼요. 이 속성이 비어 있으면 들어오는 FlowFile의 콘텐츠가 프로세서가 데이터베이스에 보낼 유효한 SQL select 쿼리를 포함할 것으로 예상돼요. Expression Language는 FlowFile 콘텐츠에 대해 평가되지 않아요.
Use Avro Logical Types DECIMAL/NUMBER, DATE, TIME, TIMESTAMP 열에 Avro Logical Types를 사용할지 여부예요. 비활성화하면 문자열로 기록돼요. 활성화하면 논리 유형을 사용해 그 밑에 있는 유형으로 기록해요. 구체적으로 DECIMAL/NUMBER는 논리 'decimal'로 기록되어 precision과 scale 메타데이터가 추가된 bytes로 기록되고, DATE는 논리 'date-millis'로 기록되어 Unix epoch(1970-01-01) 이후 일 수를 나타내는 int로 기록되며, TIME은 논리 'time-millis'로 기록되어 Unix epoch 이후 밀리초를 나타내는 int로 기록되고, TIMESTAMP는 논리 'timestamp-millis'로 기록되어 Unix epoch 이후 밀리초를 나타내는 long으로 기록돼요. 기록된 Avro 레코드를 읽는 사람도 이 논리 유형을 안다면 판독기 구현에 따라 더 많은 맥락으로 이 값을 역직렬화할 수 있어요.
compression-format Avro 파일을 기록할 때 사용할 압축 유형이에요. 기본값은 None이에요.
esql-auto-commit DB 연결의 auto commit 기능을 활성화 또는 비활성화해요. 기본값은 'true'예요. 이 프로세서는 데이터를 읽는 데 사용되므로 대부분의 JDBC 드라이버에서 기본값을 사용할 수 있고 이 기능은 대부분의 경우 영향이 없어요. 하지만 PostgreSQL 드라이버 같은 일부 JDBC 드라이버에서는 한 번에 가져오는 결과 행 수를 제한하기 위해 auto commit을 비활성화해야 해요. auto commit이 활성화되면 postgreSQL 드라이버는 전체 결과 집합을 한 번에 메모리로 로드해요. 이는 큰 데이터 집합을 가져오는 쿼리를 실행할 때 많은 메모리를 사용할 수 있어요. PostgreSQL 드라이버의 이 동작에 대한 자세한 내용은 https://jdbc.postgresql.org/documentation/head/query.html 에서 확인할 수 있어요.
esql-fetch-size 한 번에 결과 집합에서 가져올 결과 행 수예요. 데이터베이스 드라이버에 대한 힌트이며 정확히 지켜지지 않을 수 있어요. 지정된 값이 0이면 힌트는 무시돼요.
esql-max-rows 단일 FlowFile에 포함될 최대 결과 행 수예요. 이것은 아주 큰 결과 집합을 여러 FlowFile로 나눌 수 있게 해요. 지정된 값이 0이면 모든 행이 단일 FlowFile로 반환돼요.
esql-output-batch-size 프로세스 세션을 커밋하기 전에 큐에 넣을 출력 FlowFile 수예요. 0으로 설정하면 모든 결과 집합 행이 처리되고 출력 FlowFile이 다운스트림 관계로 전송될 준비가 되면 세션이 커밋돼요. 큰 결과 집합의 경우 프로세서 실행 끝에 많은 FlowFile이 한꺼번에 전송될 수 있어요. 이 속성이 설정되면 지정된 수의 FlowFile이 전송 준비가 될 때 세션이 커밋되어 FlowFile이 다운스트림 관계로 해제돼요. 참고: 이 속성이 설정되면 FlowFile에 fragment.count 속성이 설정되지 않아요.
sql-post-query 기본 SQL 쿼리 실행 후 실행되는 세미콜론으로 구분된 쿼리 목록이에요. 기본 쿼리 후 세션 속성을 설정하는 것 같은 예가 있어요. 문 안에서 세미콜론은 백슬래시(';')로 이스케이프해 포함할 수 있어요. 이 쿼리의 결과/출력은 오류가 없으면 억제돼요.
sql-pre-query 기본 SQL 쿼리 실행 전에 실행되는 세미콜론으로 구분된 쿼리 목록이에요. 예를 들어 기본 쿼리 전에 세션 속성을 설정할 수 있어요. 문 안에서 세미콜론은 백슬래시(';')로 이스케이프해 포함할 수 있어요. 이 쿼리의 결과/출력은 오류가 없으면 억제돼요.

관계(Relationships)

이름(Name) 설명(Description)
failure SQL 쿼리 실행이 실패했어요. 들어오는 FlowFile에 패널티가 주어지고 이 관계로 라우팅돼요.
success SQL 쿼리 결과 집합에서 FlowFile을 성공적으로 만들었어요.

속성 기록(Writes attributes)

이름(Name) 설명(Description)
executesql.row.count 쿼리가 반환한 행 수를 담아요. 'Max Rows Per Flow File'이 설정되면 이 숫자는 전체 결과 집합이 아닌 Flow File의 행 수를 반영해요.
executesql.query.duration 쿼리 실행 시간과 가져오기(fetch) 시간을 합친 밀리초 단위 기간이에요. 'Max Rows Per Flow File'이 설정되면 이 숫자는 전체 결과 집합이 아닌 Flow File의 행에 대한 가져오기 시간만 반영해요.
executesql.query.executiontime 밀리초 단위의 쿼리 실행 시간이에요. 이 숫자는 'Max Rows Per Flow File' 설정과 무관하게 쿼리 실행 시간을 반영해요.
executesql.query.fetchtime 밀리초 단위의 결과 집합 가져오기 시간이에요. 'Max Rows Per Flow File'이 설정되면 이 숫자는 전체 결과 집합이 아닌 Flow File의 행에 대한 가져오기 시간만 반영해요.
executesql.resultset.index 여러 결과 집합이 반환된다고 가정할 때, 이 결과 집합의 0부터 시작하는 인덱스예요.
executesql.error.message 들어오는 FlowFile 처리가 예외를 일으키면 Flow File이 failure로 라우팅되고 이 속성에 예외 메시지가 설정돼요.
fragment.identifier 'Max Rows Per Flow File'이 설정되면 같은 쿼리 결과 집합의 모든 FlowFile이 fragment.identifier 속성에 대해 같은 값을 가져요. 이를 사용해 결과를 연관지을 수 있어요.
fragment.count 'Max Rows Per Flow File'이 설정되면 단일 ResultSet이 만든 총 FlowFile 수예요. 동일한 입력 ResultSet에 속한 FlowFile 수를 알기 위해 fragment.identifier 속성과 함께 사용할 수 있어요. Output Batch Size가 설정되면 이 속성은 채워지지 않아요.
fragment.index 'Max Rows Per Flow File'이 설정되면 같은 결과 집합 FlowFile에서 파생된 모든 출력 FlowFile 목록에서 이 FlowFile의 위치예요. 어느 FlowFile이 같은 쿼리 결과 집합에서 왔고 어떤 순서로 만들어졌는지 알기 위해 fragment.identifier 속성과 함께 사용할 수 있어요.
input.flowfile.uuid 프로세서에 입력 연결이 있으면 출력 FlowFile에 이 속성이 입력 FlowFile의 UUID 값으로 설정돼요. 입력 연결이 없으면 속성이 추가되지 않아요.

더 알아보기 (Learn more)