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

주의 사항:

  1. 여러 행이 측정 컬럼에서 같은 극단값을 공유하는 경우, 서로 다른 서버의 동점을 포함해 모든 행이 함수에 의해 반환돼요. 직렬화된 결과의 null 투영은 빈 배열이 아니라 NULL로 반환돼요. (PR #19645 참고)
  2. 같은 측정 컬럼 집합에 대응하는 여러 다른 컬럼을 투영하려면, 함수를 여러 번 호출하고 매번 다른 투영 컬럼을 지정하면 돼요.
  3. 쿼리 옵션 enableNullHandling=true를 쓰면 복합 비교 키가 정의되지 않기 때문에 어느 측정 컬럼이라도 NULL이면 해당 행은 제외돼요. NULL 투영 값은 행을 제외하지 않으며, 비교에서 이긴 행이면 반환돼요.
  4. 이 구현은 AS 절과 함께 동작하지 않아요. (예: SELECT exprmin(longCol, doubleCol) AS exprmin은 동작하지 않아요)
  5. exprmin/exprmax 컬럼을 order by 절에 넣는 것(예: SELECT intCol, exprmin(longCol, doubleCol) FROM table GROUP BY intCol ORDER BY exprmin(longCol, doubleCol))은 지원되지 않아요. 다중 컬럼·다중 행 exprmin/exprmax 결과를 의미상 정렬하는 게 말이 안 되기 때문이에요.
  6. 현재 문제로 인해 MV bytes 컬럼 투영은 아직 동작하지 않아요.

더 자세한 예시는 다음을 참고하세요: https://github.com/apache/pinot/pull/10636

더 알아보기 (Learn more)