class_docstr: Logical operator for aggregate.
code: def __init__(
      self,
      input_op: LogicalOperator,
      key: Optional[str],
      aggs: List[AggregateFn],
  ):
      super().__init__(
          "Aggregate",
          input_op,
          sub_progress_bar_names=[
              ExchangeTaskSpec.MAP_SUB_PROGRESS_BAR_NAME,
              ExchangeTaskSpec.REDUCE_SUB_PROGRESS_BAR_NAME,
          ],
      )
      self._key = key
      self._aggs = aggs
  
imports: from typing import Any, Dict, List, Optional
  from ray.data._internal.logical.interfaces import LogicalOperator
  from ray.data._internal.planner.exchange.interfaces import ExchangeTaskSpec
  from ray.data._internal.planner.exchange.shuffle_task_spec import ShuffleTaskSpec
  from ray.data._internal.planner.exchange.sort_task_spec import SortTaskSpec
  from ray.data._internal.sort import SortKey
  from ray.data.aggregate import AggregateFn
label_desc: Use image node_id 1 to create a new Aggregate object from inherited base classes: AbstractAllToAll with example: obj = Aggregate(input_op, key, aggs)