groupby.hpp
转到此文件的文档。
1 /*
2  * Copyright (c) 2019-2024, NVIDIA CORPORATION.
3  *
4  * 根据 Apache 许可证 2.0 版(“许可证”)获得许可;
5  * 除非遵守许可证,否则您不得使用此文件。
6  * 您可以获得许可证的副本,地址为
7  *
8  * https://apache.ac.cn/licenses/LICENSE-2.0
9  *
10  * 除非适用法律要求或书面同意,否则软件
11  * 根据许可证分发是基于“按原样”的基础,
12  * 不提供任何形式的担保或条件,无论是明示的还是暗示的。
13  * 请参阅许可证,了解管理权限和
14  * 许可证下的限制条件的特定语言。
15  */
16 
17 #pragma once
18 
19 #include <cudf/aggregation.hpp>
21 #include <cudf/replace.hpp>
23 #include <cudf/types.hpp>
24 #include <cudf/utilities/export.hpp>
26 #include <cudf/utilities/span.hpp>
27 
28 #include <rmm/cuda_stream_view.hpp>
29 
30 #include <memory>
31 #include <utility>
32 #include <vector>
33 
34 namespace CUDF_EXPORT cudf {
36 namespace groupby { // 按键对值进行分组并在这些组上计算聚合。
37 namespace detail {
38 namespace sort { // 基于排序的分组辅助类
39 struct sort_groupby_helper;
40 
41 } // 命名空间 sort
42 } // 命名空间 detail
43 
60 struct aggregation_request { // 在列上执行分组聚合的请求。
61  column_view values; // 要聚合的元素。
62  std::vector<std::unique_ptr<groupby_aggregation>> aggregations; // 所需的聚合操作。
63 };
64 
75 struct scan_request { // 扫描列时执行分组聚合的请求。
77  std::vector<std::unique_ptr<groupby_scan_aggregation>> aggregations;
78 };
79 
87 struct aggregation_result { // 一个 aggregation_request 的结果。
89  std::vector<std::unique_ptr<column>> results{}; // 聚合结果列表
90 };
91 
95 class groupby { // 按键对值进行分组并在这些组上计算聚合。
96  public
97  groupby() = delete;
98  ~groupby();
99  groupby(groupby const&) = delete;
100  groupby(groupby&&) = delete;
101  groupby& operator=(groupby const&) = delete;
102  groupby& operator=(groupby&&) = delete;
103 
127  explicit groupby(table_view const& keys, // 用于分组的键。
128  null_policy null_handling = null_policy::EXCLUDE, // 处理键中 null 值的策略。
129  sorted keys_are_sorted = sorted::NO, // 指示键是否已排序。
130  std::vector<order> const& column_order = {}, // 如果键未排序,则每个键列的排序顺序。
131  std::vector<null_order> const& null_precedence = {}); // 如果键未排序,则每个键列的 null 值排序优先级。
132 
187  std::pair<std::unique_ptr<table>, std::vector<aggregation_result>> aggregate( // 对指定的值执行分组聚合。
188  host_span<aggregation_request const> requests, // 聚合请求列表。
189  rmm::cuda_stream_view stream = cudf::get_default_stream(), // 用于设备内存操作和内核启动的 CUDA 流。
190  rmm::device_async_resource_ref mr = cudf::get_current_device_resource_ref()); // 用于分配返回的表/列的设备内存资源。
243  std::pair<std::unique_ptr<table>, std::vector<aggregation_result>> scan( // 对指定的值执行分组扫描。
244  host_span<scan_request const> requests, // 扫描请求列表。
245  rmm::cuda_stream_view stream = cudf::get_default_stream(), // 用于设备内存操作和内核启动的 CUDA 流。
246  rmm::device_async_resource_ref mr = cudf::get_current_device_resource_ref()); // 用于分配返回的表/列的设备内存资源。
247 
299  std::pair<std::unique_ptr<table>, std::unique_ptr<table>> shift( // 对指定的值执行分组位移。
300  table_view const& values, // 要位移的值。
301  host_span<size_type const> offsets, // 每个值列的位移量。
302  std::vector<std::reference_wrapper<scalar const>> const& fill_values, // 位移位置的填充值。
303  rmm::cuda_stream_view stream = cudf::get_default_stream(), // 用于设备内存操作和内核启动的 CUDA 流。
304  rmm::device_async_resource_ref mr = cudf::get_current_device_resource_ref()); // 用于分配返回的表/列的设备内存资源。
305 
314  struct groups { // 对一组值进行 groupby 操作对应的分组数据。
315  std::unique_ptr<table> keys; // 分组后的键表。
316  std::vector<size_type> offsets; // 组偏移量。
317  std::unique_ptr<table> values; // 分组后的值表。
318  };
319 
333  groups get_groups(cudf::table_view values = {}, // 要分组的值。
334  rmm::cuda_stream_view stream = cudf::get_default_stream(), // 用于设备内存操作和内核启动的 CUDA 流。
335  rmm::device_async_resource_ref mr = cudf::get_current_device_resource_ref()); // 用于分配返回的表/列的设备内存资源。
336 
373  std::pair<std::unique_ptr<table>, std::unique_ptr<table>> replace_nulls( // 对值执行分组替换 null 值操作。
374  table_view const& values, // 要在其中替换 null 值的值。
375  host_span<cudf::replace_policy const> replace_policies, // 每个值列替换 null 值的策略。
376  rmm::cuda_stream_view stream = cudf::get_default_stream(), // 用于设备内存操作和内核启动的 CUDA 流。
377  rmm::device_async_resource_ref mr = cudf::get_current_device_resource_ref()); // 用于分配返回的表/列的设备内存资源。
378 
379  private
380  table_view _keys;
381  null_policy _include_null_keys{null_policy::EXCLUDE}; // 处理键中 null 值的策略。
383  sorted _keys_are_sorted{sorted::NO}; // 指示键是否已排序。
384  std::vector<order> _column_order{};
386  std::vector<null_order> _null_precedence{}; // 如果键未排序,则每个键列的 null 值排序优先级。
389  std::unique_ptr<detail::sort::sort_groupby_helper>
390  _helper; // 用于基于排序的分组实现的辅助类
392 
399  detail::sort::sort_groupby_helper& helper(); // 返回辅助对象,如有必要则进行初始化
400 
405  std::pair<std::unique_ptr<table>, std::vector<aggregation_result>> dispatch_aggregation( // 内部函数,用于分派到基于哈希或基于排序的分组
406  host_span<aggregation_request const> requests,
407  rmm::cuda_stream_view stream,
409 
410  // 基于排序的分组聚合
411  std::pair<std::unique_ptr<table>, std::vector<aggregation_result>> sort_aggregate(
412  host_span<aggregation_request const> requests,
413  rmm::cuda_stream_view stream,
415 
416  std::pair<std::unique_ptr<table>, std::vector<aggregation_result>> sort_scan(
417  host_span<scan_request const> requests,
418  rmm::cuda_stream_view stream,
420 };
422 } // 命名空间 groupby
423 } // 命名空间 CUDF_EXPORT cudf
用于指定基于聚合的 API 所需聚合的表示形式,例如...
作为元素列的设备数据的非拥有、不可变视图,其中一些元素可能为 null,如指示的那样...
按键对值进行分组并在这些组上计算聚合。
定义: groupby.hpp:95
std::pair< std::unique_ptr< table >, std::vector< aggregation_result > > scan(host_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())
对指定的值执行分组扫描。
std::pair< std::unique_ptr< table >, std::unique_ptr< table > > replace_nulls(table_view const &values, host_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())
对值执行分组替换 null 值操作。
std::pair< std::unique_ptr< table >, std::unique_ptr< table > > shift(table_view const &values, host_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())
对指定的值执行分组位移。
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={})
使用指定的键构造一个 groupby 对象
std::pair< std::unique_ptr< table >, std::vector< aggregation_result > > aggregate(host_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())
对指定的值执行分组聚合。
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())
获取对一组值进行 groupby 操作后对应的分组键和值。
一组大小相同的 cudf::column_view。
column view 类定义
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())
对表的行执行字典序排序。
rmm::cuda_stream_view const get_default_stream()
获取当前默认流。
rmm::device_async_resource_ref get_current_device_resource_ref()
获取当前设备内存资源引用。
cuda::mr::async_resource_ref< cuda::mr::device_accessible > device_async_resource_ref
null_policy
指定是否包含 null 值或排除 null 值的枚举类型。
定义: types.hpp:126
sorted
指示已知一组值是否已排序。
定义: types.hpp:167
cuDF 接口
定义: host_udf.hpp:37
span 的 API。
在列上执行分组聚合的请求。
定义: groupby.hpp:60
std::vector< std::unique_ptr< groupby_aggregation > > aggregations
所需的聚合操作。
定义: groupby.hpp:62
column_view values
要聚合的元素。
定义: groupby.hpp:61
一个 aggregation_request 的结果。
定义: groupby.hpp:87
对一组值进行 groupby 操作对应的分组数据。
定义: groupby.hpp:314
std::unique_ptr< table > keys
分组后的键表。
定义: groupby.hpp:315
std::vector< size_type > offsets
组偏移量。
定义: groupby.hpp:316
std::unique_ptr< table > values
分组后的值表。
定义: groupby.hpp:317
扫描列时执行分组聚合的请求。
定义: groupby.hpp:75
column_view values
要聚合的元素。
定义: groupby.hpp:76
std::vector< std::unique_ptr< groupby_scan_aggregation > > aggregations
所需的聚合操作。
定义: groupby.hpp:77
具有精简功能集的 C++20 std::span。
定义: span.hpp:194
(mutable)_table_view 的类定义
libcudf 的类型声明。