hybrid_scan.hpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION.
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
6 #pragma once
7 
8 #include <cudf/io/parquet.hpp>
11 #include <cudf/io/types.hpp>
12 #include <cudf/types.hpp>
13 #include <cudf/utilities/export.hpp>
14 
15 #include <rmm/cuda_stream_view.hpp>
16 #include <rmm/resource_ref.hpp>
17 
18 #include <memory>
19 #include <utility>
20 #include <vector>
21 
22 namespace CUDF_EXPORT cudf {
23 namespace io::parquet::experimental::detail {
28 class hybrid_scan_reader_impl;
29 } // namespace io::parquet::experimental::detail
30 } // namespace CUDF_EXPORT cudf
31 
34 
35 namespace CUDF_EXPORT cudf {
36 namespace io::parquet::experimental {
47 enum class use_data_page_mask : bool {
48  YES = true,
49  NO = false
50 };
51 
279  public:
288  parquet_reader_options const& options);
289 
298  parquet_reader_options const& options);
299 
304 
313  [[nodiscard]] FileMetaData parquet_metadata() const;
314 
320  [[nodiscard]] byte_range_info page_index_byte_range() const;
321 
331  void setup_page_index(cudf::host_span<uint8_t const> page_index_bytes) const;
332 
339  [[nodiscard]] std::vector<size_type> all_row_groups(parquet_reader_options const& options) const;
340 
348  cudf::host_span<size_type const> row_group_indices) const;
349 
358 
370  [[nodiscard]] std::vector<size_type> filter_row_groups_with_byte_range(
371  cudf::host_span<size_type const> row_group_indices,
372  parquet_reader_options const& options) const;
373 
382  [[nodiscard]] std::vector<size_type> filter_row_groups_with_stats(
383  cudf::host_span<size_type const> row_group_indices,
384  parquet_reader_options const& options,
385  rmm::cuda_stream_view stream) const;
386 
399  [[nodiscard]] std::pair<std::vector<byte_range_info>, std::vector<byte_range_info>>
401  parquet_reader_options const& options) const;
402 
413  [[nodiscard]] std::vector<size_type> filter_row_groups_with_dictionary_pages(
414  cudf::host_span<cudf::device_span<uint8_t const> const> dictionary_page_data,
415  cudf::host_span<size_type const> row_group_indices,
416  parquet_reader_options const& options,
417  rmm::cuda_stream_view stream) const;
418 
431  [[nodiscard]] std::vector<size_type> filter_row_groups_with_bloom_filters(
432  cudf::host_span<cudf::device_span<uint8_t const> const> bloom_filter_data,
433  cudf::host_span<size_type const> row_group_indices,
434  parquet_reader_options const& options,
435  rmm::cuda_stream_view stream) const;
436 
447  [[nodiscard]] std::unique_ptr<cudf::column> build_all_true_row_mask(
448  cudf::host_span<size_type const> row_group_indices,
449  rmm::cuda_stream_view stream,
451 
463  [[nodiscard]] std::unique_ptr<cudf::column> build_row_mask_with_page_index_stats(
464  cudf::host_span<size_type const> row_group_indices,
465  parquet_reader_options const& options,
466  rmm::cuda_stream_view stream,
468 
476  [[nodiscard]] std::vector<byte_range_info> filter_column_chunks_byte_ranges(
477  cudf::host_span<size_type const> row_group_indices,
478  parquet_reader_options const& options) const;
479 
494  cudf::host_span<size_type const> row_group_indices,
495  cudf::host_span<cudf::device_span<uint8_t const> const> column_chunk_data,
496  cudf::mutable_column_view& row_mask,
497  use_data_page_mask mask_data_pages,
498  parquet_reader_options const& options,
499  rmm::cuda_stream_view stream,
501 
509  [[nodiscard]] std::vector<byte_range_info> payload_column_chunks_byte_ranges(
510  cudf::host_span<size_type const> row_group_indices,
511  parquet_reader_options const& options) const;
512 
526  cudf::host_span<size_type const> row_group_indices,
527  cudf::host_span<cudf::device_span<uint8_t const> const> column_chunk_data,
528  cudf::column_view const& row_mask,
529  use_data_page_mask mask_data_pages,
530  parquet_reader_options const& options,
531  rmm::cuda_stream_view stream,
533 
541  [[nodiscard]] std::vector<byte_range_info> all_column_chunks_byte_ranges(
542  cudf::host_span<size_type const> row_group_indices,
543  parquet_reader_options const& options) const;
544 
556  cudf::host_span<size_type const> row_group_indices,
557  cudf::host_span<cudf::device_span<uint8_t const> const> column_chunk_data,
558  parquet_reader_options const& options,
559  rmm::cuda_stream_view stream,
577  std::size_t chunk_read_limit,
578  std::size_t pass_read_limit,
579  cudf::host_span<size_type const> row_group_indices,
580  cudf::column_view const& row_mask,
581  use_data_page_mask mask_data_pages,
582  cudf::host_span<cudf::device_span<uint8_t const> const> column_chunk_data,
583  parquet_reader_options const& options,
584  rmm::cuda_stream_view stream,
586 
596  cudf::mutable_column_view& row_mask) const;
597 
614  std::size_t chunk_read_limit,
615  std::size_t pass_read_limit,
616  cudf::host_span<size_type const> row_group_indices,
617  cudf::column_view const& row_mask,
618  use_data_page_mask mask_data_pages,
619  cudf::host_span<cudf::device_span<uint8_t const> const> column_chunk_data,
620  parquet_reader_options const& options,
621  rmm::cuda_stream_view stream,
623 
633  cudf::column_view const& row_mask) const;
634 
650  std::size_t chunk_read_limit,
651  std::size_t pass_read_limit,
652  cudf::host_span<size_type const> row_group_indices,
653  cudf::host_span<cudf::device_span<uint8_t const> const> column_chunk_data,
654  parquet_reader_options const& options,
655  rmm::cuda_stream_view stream,
657 
664 
670  [[nodiscard]] bool has_next_table_chunk() const;
671 
672  private:
673  std::unique_ptr<detail::hybrid_scan_reader_impl> _impl;
674 };
675  // end of group
677 
678 } // namespace io::parquet::experimental
679 } // namespace CUDF_EXPORT cudf
A non-owning, immutable view of device data as a column of elements, some of which may be null as ind...
The experimental parquet reader class to optimally read parquet files subject to highly selective fil...
std::unique_ptr< cudf::column > build_row_mask_with_page_index_stats(cudf::host_span< size_type const > row_group_indices, parquet_reader_options const &options, rmm::cuda_stream_view stream, rmm::device_async_resource_ref mr) const
Builds a boolean column indicating surviving rows using page-level statistics in the page index.
table_with_metadata materialize_filter_columns(cudf::host_span< size_type const > row_group_indices, cudf::host_span< cudf::device_span< uint8_t const > const > column_chunk_data, cudf::mutable_column_view &row_mask, use_data_page_mask mask_data_pages, parquet_reader_options const &options, rmm::cuda_stream_view stream, rmm::device_async_resource_ref mr) const
Materializes filter columns and updates the input row mask to only the rows that exist in the output ...
std::unique_ptr< cudf::column > build_all_true_row_mask(cudf::host_span< size_type const > row_group_indices, rmm::cuda_stream_view stream, rmm::device_async_resource_ref mr) const
Builds a boolean (survival) column of size equal to the total number of rows in the row groups contai...
std::vector< size_type > filter_row_groups_with_dictionary_pages(cudf::host_span< cudf::device_span< uint8_t const > const > dictionary_page_data, cudf::host_span< size_type const > row_group_indices, parquet_reader_options const &options, rmm::cuda_stream_view stream) const
Filter the row groups using column chunk dictionary pages.
void setup_page_index(cudf::host_span< uint8_t const > page_index_bytes) const
Setup the page index within the Parquet file metadata (FileMetaData)
std::vector< byte_range_info > payload_column_chunks_byte_ranges(cudf::host_span< size_type const > row_group_indices, parquet_reader_options const &options) const
Get byte ranges of column chunks of payload columns.
byte_range_info page_index_byte_range() const
Get the byte range of the page index in the Parquet file.
std::vector< byte_range_info > all_column_chunks_byte_ranges(cudf::host_span< size_type const > row_group_indices, parquet_reader_options const &options) const
Get byte ranges of column chunks of all (or selected) columns.
std::vector< size_type > filter_row_groups_with_bloom_filters(cudf::host_span< cudf::device_span< uint8_t const > const > bloom_filter_data, cudf::host_span< size_type const > row_group_indices, parquet_reader_options const &options, rmm::cuda_stream_view stream) const
Filter the row groups using column chunk bloom filters.
hybrid_scan_reader(cudf::host_span< uint8_t const > footer_bytes, parquet_reader_options const &options)
Constructor for the experimental parquet reader class to optimally read Parquet files subject to high...
table_with_metadata materialize_filter_columns_chunk(cudf::mutable_column_view &row_mask) const
Materializes a chunk of filter columns and updates the corresponding range of input row mask to only ...
std::pair< std::vector< byte_range_info >, std::vector< byte_range_info > > secondary_filters_byte_ranges(cudf::host_span< size_type const > row_group_indices, parquet_reader_options const &options) const
Get byte ranges of bloom filters and dictionary pages (secondary filters) for row group pruning.
table_with_metadata materialize_payload_columns_chunk(cudf::column_view const &row_mask) const
Materializes a chunk of payload columns and applies the corresponding range of input row mask to the ...
std::vector< size_type > filter_row_groups_with_byte_range(cudf::host_span< size_type const > row_group_indices, parquet_reader_options const &options) const
Filter the row groups using the specified byte range specified by [bytes_to_skip, bytes_to_skip + byt...
hybrid_scan_reader(FileMetaData const &parquet_metadata, parquet_reader_options const &options)
Constructor for the experimental parquet reader class to optimally read Parquet files subject to high...
table_with_metadata materialize_payload_columns(cudf::host_span< size_type const > row_group_indices, cudf::host_span< cudf::device_span< uint8_t const > const > column_chunk_data, cudf::column_view const &row_mask, use_data_page_mask mask_data_pages, parquet_reader_options const &options, rmm::cuda_stream_view stream, rmm::device_async_resource_ref mr) const
Materialize payload columns and applies the row mask to the output table.
void reset_column_selection() const
Resets the current column selection.
FileMetaData parquet_metadata() const
Get the Parquet file footer metadata.
void setup_chunking_for_all_columns(std::size_t chunk_read_limit, std::size_t pass_read_limit, cudf::host_span< size_type const > row_group_indices, cudf::host_span< cudf::device_span< uint8_t const > const > column_chunk_data, parquet_reader_options const &options, rmm::cuda_stream_view stream, rmm::device_async_resource_ref mr) const
Setup chunking information for all (or selected) columns and preprocess the input data pages.
std::vector< size_type > filter_row_groups_with_stats(cudf::host_span< size_type const > row_group_indices, parquet_reader_options const &options, rmm::cuda_stream_view stream) const
Filter the input row groups using column chunk statistics.
std::vector< size_type > all_row_groups(parquet_reader_options const &options) const
Get all available row groups from the parquet file.
void setup_chunking_for_filter_columns(std::size_t chunk_read_limit, std::size_t pass_read_limit, cudf::host_span< size_type const > row_group_indices, cudf::column_view const &row_mask, use_data_page_mask mask_data_pages, cudf::host_span< cudf::device_span< uint8_t const > const > column_chunk_data, parquet_reader_options const &options, rmm::cuda_stream_view stream, rmm::device_async_resource_ref mr) const
Setup chunking information for filter columns and preprocess the input data pages.
size_type total_rows_in_row_groups(cudf::host_span< size_type const > row_group_indices) const
Get the total number of top-level rows in the row groups.
table_with_metadata materialize_all_columns(cudf::host_span< size_type const > row_group_indices, cudf::host_span< cudf::device_span< uint8_t const > const > column_chunk_data, parquet_reader_options const &options, rmm::cuda_stream_view stream, rmm::device_async_resource_ref mr) const
Materializes all (or selected) columns and returns the final output table.
void setup_chunking_for_payload_columns(std::size_t chunk_read_limit, std::size_t pass_read_limit, cudf::host_span< size_type const > row_group_indices, cudf::column_view const &row_mask, use_data_page_mask mask_data_pages, cudf::host_span< cudf::device_span< uint8_t const > const > column_chunk_data, parquet_reader_options const &options, rmm::cuda_stream_view stream, rmm::device_async_resource_ref mr) const
Setup chunking information for payload columns and preprocess the input data pages.
bool has_next_table_chunk() const
Check if there is any parquet data left to read for the current setup.
std::vector< byte_range_info > filter_column_chunks_byte_ranges(cudf::host_span< size_type const > row_group_indices, parquet_reader_options const &options) const
Get byte ranges of column chunks of filter columns.
~hybrid_scan_reader()
Destructor for the experimental parquet reader class.
table_with_metadata materialize_all_columns_chunk() const
Materializes all (or selected) columns and returns the final output table.
Information about content of a parquet file.
Settings for read_parquet().
Definition: parquet.hpp:66
stores offset and size used to indicate a byte range
A non-owning, mutable view of device data as a column of elements, some of which may be null as indic...
use_data_page_mask
Whether to compute and use a page mask using the row mask to skip decompression and decoding of the m...
Definition: hybrid_scan.hpp:47
@ YES
Compute and use a data page mask.
@ NO
Do not compute or use a data page mask.
detail::cccl_async_resource_ref< cuda::mr::resource_ref< cuda::mr::device_accessible > > device_async_resource_ref
cuda::std::span< T, Extent > device_span
Device span is an alias of cuda::std::span.
Definition: span.hpp:320
int32_t size_type
Row index type for columns and tables.
Definition: types.hpp:84
cuDF-IO API type definitions
cuDF interfaces
Definition: host_udf.hpp:26
Parquet footer schema structs.
C++20 std::span with reduced feature set.
Definition: span.hpp:184
Thrift-derived struct describing file-level metadata.
Table with table metadata used by io readers to return the metadata by value.
Definition: io/types.hpp:292
Type declarations for libcudf.