EXPR_MIN / EXPR_MAX 함수
EXPR_MIN / EXPR_MAX 함수
Apache Pinot의 EXPR_MIN / EXPR_MAX 함수는 지정한 측정 컬럼에서 최댓값과 최솟값을 찾아내고, 그 극단값이 발견된 행에 해당하는 투영(projection) 컬럼의 값을 함께 돌려줘요. 극단 측정값을 데이터셋의 다른 부분의 데이터와 연결하려고 할 때 유용해요.
출처: 문서
본문
EXPR_MIN / EXPR_MAX 함수는 주어진 데이터셋을 스캔해 지정한 측정 컬럼의 최댓값과 최솟값을 식별해요. 이 극단값(최댓값·최솟값)을 찾으면 함수는 해당 극단값이 측정 컬럼에서 발견된 행과 연관된 투영 컬럼의 항목들을 찾아요. 그런 다음 이 투영 컬럼 값들을 반환해, 극단 측정값을 데이터셋의 다른 부분과 연결해줘요.
전제 조건
이 함수는 브로커에서 다음 설정과 함께 사용해야 해요:
pinot.broker.query.rewriter.class.names: DEFAULT_QUERY_REWRITERS_CLASS_NAMES + ",org.apache.pinot.sql.parsers.rewriter.ExprMinMaxRewriter"
pinot.broker.result.rewriter.class.names: "org.apache.pinot.core.query.utils.rewriter.ParentAggregationResultRewriter"
시그니처
EXPR_MIN (projectionCol, measuringCol1, measuringCol2, measuringCol3)
EXPR_MAX (projectionCol, measuringCol1, measuringCol2, measuringCol3)
사용 예시
활동이 가장 많은 사용자를 찾아요. 사용자가 여러 명이면 last_activity_date로 동점을 깨고, 그래도 동점이면 user_id로 깨요. 그리고 user_id를 투영해요.
SELECT EXPR_MAX(user_id, activity, last_activity_date, user_id)
FROM userEngagmentTable
더 유용한 점은 이런 집계 함수 여러 개를 GROUP BY와 함께 쓸 수 있다는 거예요.
SELECT user_region, EXPR_MAX(user_id, activity, last_activity_date, user_id),
EXPR_MIN(user_id, user_satisfaction)
FROM userEngagmentTable
GROUP BY user_region
주의 사항:
- 여러 행이 측정 컬럼에서 같은 극단값을 공유하는 경우, 서로 다른 서버의 동점을 포함해 모든 행이 함수에 의해 반환돼요. 직렬화된 결과의 null 투영은 빈 배열이 아니라
NULL로 반환돼요. (PR #19645 참고) - 같은 측정 컬럼 집합에 대응하는 여러 다른 컬럼을 투영하려면, 함수를 여러 번 호출하고 매번 다른 투영 컬럼을 지정하면 돼요.
- 쿼리 옵션
enableNullHandling=true를 쓰면 복합 비교 키가 정의되지 않기 때문에 어느 측정 컬럼이라도NULL이면 해당 행은 제외돼요.NULL투영 값은 행을 제외하지 않으며, 비교에서 이긴 행이면 반환돼요. - 이 구현은 AS 절과 함께 동작하지 않아요. (예:
SELECT exprmin(longCol, doubleCol) AS exprmin은 동작하지 않아요) exprmin/exprmax컬럼을 order by 절에 넣는 것(예:SELECT intCol, exprmin(longCol, doubleCol) FROM table GROUP BY intCol ORDER BY exprmin(longCol, doubleCol))은 지원되지 않아요. 다중 컬럼·다중 행exprmin/exprmax결과를 의미상 정렬하는 게 말이 안 되기 때문이에요.- 현재 문제로 인해 MV bytes 컬럼 투영은 아직 동작하지 않아요.
더 자세한 예시는 다음을 참고하세요: https://github.com/apache/pinot/pull/10636