Implementation:Apache Druid GroupingTableModule
| Knowledge Sources | |
|---|---|
| Domains | Web_Console, Data_Visualization |
| Last Updated | 2026-02-10 10:00 GMT |
Overview
GroupingTableModule is a visualization module that renders aggregated query results as an interactive grouped table with support for pivoting, time bucketing, comparisons, and column ordering.
Description
The module registers itself with the ModuleRepository under the id 'grouping-table' and defines a rich set of parameters including split columns, time bucket granularity, show columns, pivot column, measures, period-over-period comparisons, and row limits. At render time, it builds a SQL query using makeTableQueryAndHints, optionally fetching pivot values first, then displays the results in a GenericOutputTable. The module supports dynamic column ordering, comparison strategies (auto, filtered, join), multiple comparison types (value, delta, percent), and a configurable "restrict top" policy for comparative queries.
Usage
This module is available in the explore view's module picker as "Grouping table". It is rendered by ModulePane whenever the user selects a table-based visualization for analyzing grouped and aggregated data.
Code Reference
Source Location
- Repository: Apache Druid
- File: web-console/src/views/explore-view/modules/grouping-table-module/grouping-table-module.tsx
- Lines: 1-343
Signature
interface GroupingTableParameterValues {
splitColumns: ExpressionMeta[];
timeBucket: string;
showColumns: ExpressionMeta[];
multipleValueMode: MultipleValueMode;
pivotColumn: ExpressionMeta;
maxPivotValues: number;
measures: Measure[];
compares: Compare[];
compareStrategy: CompareStrategy;
compareTypes: CompareType[];
restrictTop: RestrictTop;
maxRows: number;
orderByColumn?: string;
orderByDirection: SqlOrderByDirection;
}
// Registered via:
ModuleRepository.registerModule<GroupingTableParameterValues>({
id: 'grouping-table',
title: 'Grouping table',
icon: IconNames.PANEL_TABLE,
parameters: { ... },
component: function GroupingTableModule(props): JSX.Element,
});
Import
// Module is auto-registered via side-effect import:
import './views/explore-view/modules/grouping-table-module/grouping-table-module';
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| splitColumns | ExpressionMeta[] | No | Columns to group by in the query |
| timeBucket | string | No | Time granularity for timestamp columns (e.g., 'PT1H', 'P1D') |
| showColumns | ExpressionMeta[] | No | Additional columns to display alongside grouped results |
| multipleValueMode | MultipleValueMode | No | How to handle shown columns with multiple values per group |
| pivotColumn | ExpressionMeta | No | Column to pivot, creating sub-columns for each distinct value |
| maxPivotValues | number | No | Maximum number of pivot values to display (default: 10) |
| measures | Measure[] | Yes | Aggregate measures to compute (non-empty required) |
| compares | Compare[] | No | Period-over-period comparison offsets (e.g., 'P1D', 'P1M') |
| compareStrategy | CompareStrategy | No | Strategy for comparison queries: 'auto', 'filtered', or 'join' |
| compareTypes | CompareType[] | No | Types of comparison values to show: 'value', 'delta', 'percent', etc. |
| restrictTop | RestrictTop | No | Whether to restrict comparative queries to top-K values |
| maxRows | number | Yes | Maximum number of result rows (default: 200) |
| orderByColumn | string | No | Column name to order results by |
| orderByDirection | SqlOrderByDirection | No | Sort direction: 'ASC' or 'DESC' |
Outputs
| Name | Type | Description |
|---|---|---|
| Rendered table | JSX.Element | A GenericOutputTable displaying the aggregated and optionally pivoted query results |
Usage Examples
Module registration (automatic)
// The module registers itself when the file is imported.
// Users select "Grouping table" from the ModulePicker in the explore view.
// Example parameter values after user configuration:
const parameterValues = {
splitColumns: [expressionForCity],
measures: [Measure.COUNT, sumRevenueMeasure],
maxRows: 100,
orderByDirection: 'DESC',
};