groupby.hpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2019-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
6 #pragma once
7 
8 #include <cudf/aggregation.hpp>
10 #include <cudf/replace.hpp>
12 #include <cudf/types.hpp>
13 #include <cudf/utilities/export.hpp>
15 #include <cudf/utilities/span.hpp>
16 
17 #include <rmm/cuda_stream_view.hpp>
18 
19 #include <memory>
20 #include <span>
21 #include <utility>
22 #include <vector>
23 
24 namespace CUDF_EXPORT cudf {
26 namespace groupby {
27 namespace detail {
28 namespace sort {
29 struct sort_groupby_helper;
30 
31 } // namespace sort
32 } // namespace detail
33 
53  std::vector<std::unique_ptr<groupby_aggregation>> aggregations;
54 };
55 
66 struct scan_request {
68  std::vector<std::unique_ptr<groupby_scan_aggregation>> aggregations;
69 };
70 
80  std::vector<std::unique_ptr<column>> results{};
81 };
82 
86 class groupby {
87  public:
88  groupby() = delete;
89  ~groupby();
90  groupby(groupby const&) = delete;
91  groupby(groupby&&) = delete;
92  groupby& operator=(groupby const&) = delete;
93  groupby& operator=(groupby&&) = delete;
94 
118  explicit groupby(table_view const& keys,
119  null_policy null_handling = null_policy::EXCLUDE,
120  sorted keys_are_sorted = sorted::NO,
121  std::vector<order> const& column_order = {},
122  std::vector<null_order> const& null_precedence = {});
123 
178  std::pair<std::unique_ptr<table>, std::vector<aggregation_result>> aggregate(
179  std::span<aggregation_request const> requests,
234  std::pair<std::unique_ptr<table>, std::vector<aggregation_result>> scan(
235  std::span<scan_request const> requests,
238 
290  std::pair<std::unique_ptr<table>, std::unique_ptr<table>> shift(
291  table_view const& values,
292  std::span<size_type const> offsets,
293  std::vector<std::reference_wrapper<scalar const>> const& fill_values,
296 
305  struct groups {
306  std::unique_ptr<table> keys;
307  std::vector<size_type> offsets;
308  std::unique_ptr<table> values;
309  };
310 
327 
364  std::pair<std::unique_ptr<table>, std::unique_ptr<table>> replace_nulls(
365  table_view const& values,
366  std::span<cudf::replace_policy const> replace_policies,
369 
370  private:
371  table_view _keys;
372  null_policy _include_null_keys{null_policy::EXCLUDE};
374  sorted _keys_are_sorted{sorted::NO};
375  std::vector<order> _column_order{};
377  std::vector<null_order> _null_precedence{};
380  std::unique_ptr<detail::sort::sort_groupby_helper>
381  _helper;
383 
390  detail::sort::sort_groupby_helper& helper();
391 
396  std::pair<std::unique_ptr<table>, std::vector<aggregation_result>> dispatch_aggregation(
397  std::span<aggregation_request const> requests,
398  rmm::cuda_stream_view stream,
400 
401  // Sort-based groupby
402  std::pair<std::unique_ptr<table>, std::vector<aggregation_result>> sort_aggregate(
403  std::span<aggregation_request const> requests,
404  rmm::cuda_stream_view stream,
406 
407  std::pair<std::unique_ptr<table>, std::vector<aggregation_result>> sort_scan(
408  std::span<scan_request const> requests,
409  rmm::cuda_stream_view stream,
411 };
412 
427  std::unique_ptr<groupby_aggregation> aggregation;
428 };
429 
476  public:
477  streaming_groupby() = delete;
479  streaming_groupby(streaming_groupby const&) = delete;
480  streaming_groupby& operator=(streaming_groupby const&) = delete;
481 
484 
489  streaming_groupby& operator=(streaming_groupby&&) noexcept;
490 
504  explicit streaming_groupby(host_span<size_type const> key_indices,
506  size_type max_distinct_keys,
507  null_policy null_handling = null_policy::EXCLUDE);
508 
522  void aggregate(table_view const& data, rmm::cuda_stream_view stream = cudf::get_default_stream());
523 
540  void merge(streaming_groupby const& other,
541  rmm::cuda_stream_view stream = cudf::get_default_stream());
542 
558  [[nodiscard]] std::pair<std::unique_ptr<table>, std::vector<aggregation_result>> finalize(
559  rmm::cuda_stream_view stream = cudf::get_default_stream(),
561 
569  [[nodiscard]] size_type distinct_keys() const noexcept;
570 
571  private:
572  struct impl;
573  std::unique_ptr<impl> _impl;
574 
575  void do_aggregate(table_view const& data, rmm::cuda_stream_view stream);
576  void do_merge(streaming_groupby const& other, rmm::cuda_stream_view stream);
577  [[nodiscard]] std::pair<std::unique_ptr<table>, std::vector<aggregation_result>> do_finalize(
578  rmm::cuda_stream_view stream, rmm::device_async_resource_ref mr) const;
579 };
580 
593 [[nodiscard]] bool is_streaming_groupby_supported(data_type values_type, aggregation::Kind kind);
594 
596 } // namespace groupby
597 } // namespace CUDF_EXPORT cudf
Representation for specifying desired aggregations from aggregation-based APIs, e....
Abstract base class for specifying the desired aggregation in an aggregation_request.
Definition: aggregation.hpp:74
A non-owning, immutable view of device data as a column of elements, some of which may be null as ind...
Indicator for the logical data type of an element in a column.
Definition: types.hpp:287
Groups values by keys and computes aggregations on those groups.
Definition: groupby.hpp:86
std::pair< std::unique_ptr< table >, std::unique_ptr< table > > replace_nulls(table_view const &values, std::span< cudf::replace_policy const > replace_policies, rmm::cuda_stream_view stream=cudf::get_default_stream(), rmm::device_async_resource_ref mr=cudf::get_current_device_resource_ref())
Performs grouped replace nulls on value.
std::pair< std::unique_ptr< table >, std::vector< aggregation_result > > scan(std::span< scan_request const > requests, rmm::cuda_stream_view stream=cudf::get_default_stream(), rmm::device_async_resource_ref mr=cudf::get_current_device_resource_ref())
Performs grouped scans on the specified values.
groupby(table_view const &keys, null_policy null_handling=null_policy::EXCLUDE, sorted keys_are_sorted=sorted::NO, std::vector< order > const &column_order={}, std::vector< null_order > const &null_precedence={})
Construct a groupby object with the specified keys
std::pair< std::unique_ptr< table >, std::unique_ptr< table > > shift(table_view const &values, std::span< size_type const > offsets, std::vector< std::reference_wrapper< scalar const >> const &fill_values, rmm::cuda_stream_view stream=cudf::get_default_stream(), rmm::device_async_resource_ref mr=cudf::get_current_device_resource_ref())
Performs grouped shifts for specified values.
std::pair< std::unique_ptr< table >, std::vector< aggregation_result > > aggregate(std::span< aggregation_request const > requests, rmm::cuda_stream_view stream=cudf::get_default_stream(), rmm::device_async_resource_ref mr=cudf::get_current_device_resource_ref())
Performs grouped aggregations on the specified values.
groups get_groups(cudf::table_view values={}, rmm::cuda_stream_view stream=cudf::get_default_stream(), rmm::device_async_resource_ref mr=cudf::get_current_device_resource_ref())
Get the grouped keys and values corresponding to a groupby operation on a set of values.
Stateful streaming groupby that accumulates partial aggregates across batches.
Definition: groupby.hpp:475
streaming_groupby(streaming_groupby &&) noexcept
Move constructor.
A set of cudf::column_view's of the same size.
Definition: table_view.hpp:189
A set of cudf::column's of the same size.
Definition: table.hpp:29
column view class definitions
APIs for replacing null and specified values within columns.
bool is_streaming_groupby_supported(data_type values_type, aggregation::Kind kind)
Returns true if streaming_groupby supports the given value type and aggregation kind combination.
std::unique_ptr< cudf::table > merge(std::vector< table_view > const &tables_to_merge, std::vector< cudf::size_type > const &key_cols, std::vector< cudf::order > const &column_order, std::vector< cudf::null_order > const &null_precedence={}, rmm::cuda_stream_view stream=cudf::get_default_stream(), rmm::device_async_resource_ref mr=cudf::get_current_device_resource_ref())
Merge a set of sorted tables.
std::unique_ptr< table > sort(table_view const &input, std::vector< order > const &column_order={}, std::vector< null_order > const &null_precedence={}, rmm::cuda_stream_view stream=cudf::get_default_stream(), rmm::device_async_resource_ref mr=cudf::get_current_device_resource_ref())
Performs a lexicographic sort of the rows of a table.
rmm::cuda_stream_view const get_default_stream()
Get the current default stream.
rmm::device_async_resource_ref get_current_device_resource_ref()
Get the current device memory resource reference.
device_async_resource_ref get_current_device_resource_ref()
cuda::mr::resource_ref< cuda::mr::device_accessible > device_async_resource_ref
int32_t size_type
Row index type for columns and tables.
Definition: types.hpp:85
null_policy
Enum to specify whether to include nulls or exclude nulls.
Definition: types.hpp:116
sorted
Indicates whether a collection of values is known to be sorted.
Definition: types.hpp:157
APIs for getting and setting the current device memory resource.
cuDF interfaces
Definition: host_udf.hpp:26
APIs for spans.
Request for groupby aggregation(s) to perform on a column.
Definition: groupby.hpp:51
std::vector< std::unique_ptr< groupby_aggregation > > aggregations
Desired aggregations.
Definition: groupby.hpp:53
column_view values
The elements to aggregate.
Definition: groupby.hpp:52
The result(s) of an aggregation_request
Definition: groupby.hpp:78
The grouped data corresponding to a groupby operation on a set of values.
Definition: groupby.hpp:305
std::unique_ptr< table > keys
Table of grouped keys.
Definition: groupby.hpp:306
std::vector< size_type > offsets
Group Offsets.
Definition: groupby.hpp:307
std::unique_ptr< table > values
Table of grouped values.
Definition: groupby.hpp:308
Request for groupby aggregation(s) for scanning a column.
Definition: groupby.hpp:66
column_view values
The elements to aggregate.
Definition: groupby.hpp:67
std::vector< std::unique_ptr< groupby_scan_aggregation > > aggregations
Desired aggregations.
Definition: groupby.hpp:68
Request for a single streaming groupby aggregation on a column.
Definition: groupby.hpp:425
std::unique_ptr< groupby_aggregation > aggregation
Desired aggregation.
Definition: groupby.hpp:427
size_type column_index
Index of the value column.
Definition: groupby.hpp:426
Host span, a non-owning view over a contiguous sequence of host-accessible elements.
Definition: span.hpp:62
Class definitions for (mutable)_table_view
Type declarations for libcudf.