Skip to main content

GPU Dataframe grouping and aggregation

Group dense categorical values

Group keys must use uint32 GPU storage. Dictionary-backed keys infer their dense group count from the adapter-owned labels; raw uint32 keys require an explicit groupCount. The following example assumes the dataframe also contains a dictionary-backed category column.

const grouped = dataframe
.filter(column('fare').greaterThan(parameter('minimumFare', 10)))
.groupBy('category')
.aggregate({
rides: 'count',
totalFare: {sum: 'fare'},
minimumFare: {min: 'fare'},
maximumFare: {max: 'fare'},
averageFare: {mean: 'fare'}
});

const explicitGroups = dataframe.groupBy('category', {groupCount: 4});

Grouping preserves the category dictionary and publishes one row for every dense group, including empty groups. Nullable keys are excluded. Count results are uint32; summed, minimum, maximum, and mean values currently require float32 input. Null, NaN, and infinite metric values do not contribute. Empty numeric groups have an explicit invalid output mask; their sum payload is zero and minimum, maximum, and mean payloads are NaN.

Cross-batch grouping accumulates contributions from every original source batch without repacking the source table. CompiledGPUDataFrameGroupedAggregation.groupCount exposes the dense domain.

Compute global reductions and explicit histograms

Global reductions support packed float32, sint32, and uint32 metric columns:

const totals = dataframe.aggregate({
rows: 'count',
totalFare: {sum: 'fare'},
minimumFare: {min: 'fare'},
maximumFare: {max: 'fare'},
averageFare: {mean: 'fare'}
});

const equalWidth = dataframe.histogram('fare', {
bins: 8,
domain: [0, 80]
});

const customEdges = dataframe.histogram('fare', {
edges: [0, 10, 25, 50, 100]
});

count counts selected source rows and produces uint32. A metric's sum, minimum, and maximum retain its input format; its mean is float32. Metric nulls and nonfinite floating-point values are excluded independently, and each potentially empty metric has an explicit one-row validity mask. Native integer sums wrap to their 32-bit representation, floating-point reductions retain float32 precision, and oversized row counts are rejected instead of silently overflowing.

Histograms publish a dense GPU table of uint32 bin identifiers and count values. Supply either an explicit equal-width domain or 2–257 strictly ascending literal edges; automatic domains are not supported because masked or nullable source values must not influence an inferred extent. Existing filters, null masks, derived columns, and repeated query parameters apply before binning.