parquet_schema.hpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
11 #pragma once
12 
13 #include <cudf/types.hpp>
14 
15 #include <cuda/std/optional>
16 
17 #include <cstdint>
18 #include <optional>
19 #include <string>
20 #include <vector>
21 
22 namespace CUDF_EXPORT cudf {
23 namespace io::parquet {
32 enum class Type : int8_t {
33  UNDEFINED = -1, // Undefined for non-leaf nodes
34  BOOLEAN = 0,
35  INT32 = 1,
36  INT64 = 2,
37  INT96 = 3, // Deprecated
38  FLOAT = 4,
39  DOUBLE = 5,
40  BYTE_ARRAY = 6,
41  FIXED_LEN_BYTE_ARRAY = 7,
42 };
43 
47 enum class ConvertedType : int8_t {
48  UNKNOWN = -1, // No type information present
49  UTF8 = 0, // a BYTE_ARRAY may contain UTF8 encoded chars
50  MAP = 1, // a map is converted as an optional field containing a repeated key/value pair
51  MAP_KEY_VALUE = 2, // a key/value pair is converted into a group of two fields
52  LIST =
53  3, // a list is converted into an optional field containing a repeated field for its values
54  ENUM = 4, // an enum is converted into a binary field
55  DECIMAL = 5, // A decimal value. 10^(-scale) encoded as 2's complement big endian
56  // (precision=number of digits, scale=location of decimal point)
57  DATE = 6, // A Date, stored as days since Unix epoch, encoded as the INT32 physical type.
58  TIME_MILLIS = 7, // A time. The total number of milliseconds since midnight.The value is stored
59  // as an INT32 physical type.
60  TIME_MICROS = 8, // A time. The total number of microseconds since midnight. The value is stored
61  // as an INT64 physical type.
62  TIMESTAMP_MILLIS = 9, // A date/time combination, recorded as milliseconds since the Unix epoch
63  // using physical type of INT64.
64  TIMESTAMP_MICROS = 10, // A date/time combination, microseconds since the Unix epoch as INT64
65  UINT_8 = 11, // An unsigned integer 8-bit value as INT32
66  UINT_16 = 12, // An unsigned integer 16-bit value as INT32
67  UINT_32 = 13, // An unsigned integer 32-bit value as INT32
68  UINT_64 = 14, // An unsigned integer 64-bit value as INT64
69  INT_8 = 15, // A signed integer 8-bit value as INT32
70  INT_16 = 16, // A signed integer 16-bit value as INT32
71  INT_32 = 17, // A signed integer 32-bit value as INT32
72  INT_64 = 18, // A signed integer 8-bit value as INT64
73  JSON = 19, // A JSON document embedded within a single UTF8 column.
74  BSON = 20, // A BSON document embedded within a single BINARY column.
75  INTERVAL = 21, // This type annotates a time interval stored as a FIXED_LEN_BYTE_ARRAY of length
76  // 12 for 3 integers {months,days,milliseconds}
77  NA = 25, // No Type information, For eg, all-nulls.
78 };
79 
83 enum class Encoding : uint8_t {
84  PLAIN = 0,
85  GROUP_VAR_INT = 1, // Deprecated, never used
86  PLAIN_DICTIONARY = 2,
87  RLE = 3,
88  BIT_PACKED = 4, // Deprecated by parquet-format in 2013, superseded by RLE
89  DELTA_BINARY_PACKED = 5,
90  DELTA_LENGTH_BYTE_ARRAY = 6,
91  DELTA_BYTE_ARRAY = 7,
92  RLE_DICTIONARY = 8,
93  BYTE_STREAM_SPLIT = 9,
94  NUM_ENCODINGS = 10,
95 };
96 
100 enum class Compression : uint8_t {
101  UNCOMPRESSED = 0,
102  SNAPPY = 1,
103  GZIP = 2,
104  LZO = 3,
105  BROTLI = 4, // Added in 2.3.2
106  LZ4 = 5, // deprecated; based on LZ4, but with an additional undocumented framing scheme
107  ZSTD = 6, // Added in 2.3.2
108  LZ4_RAW = 7, // "standard" LZ4 block format
109 };
110 
114 enum class FieldRepetitionType : int8_t {
115  UNSPECIFIED = -1,
116  REQUIRED = 0, // This field is required (can not be null) and each record has exactly 1 value.
117  OPTIONAL = 1, // The field is optional (can be null) and each record has 0 or 1 values.
118  REPEATED = 2, // The field is repeated and can contain 0 or more values
119 };
120 
124 enum class PageType : uint8_t {
125  DATA_PAGE = 0,
126  INDEX_PAGE = 1,
127  DICTIONARY_PAGE = 2,
128  DATA_PAGE_V2 = 3,
129 };
130 
135 enum class BoundaryOrder : uint8_t {
136  UNORDERED = 0,
137  ASCENDING = 1,
138  DESCENDING = 2,
139 };
140 
144 enum class FieldType : uint8_t {
145  BOOLEAN_TRUE = 1,
146  BOOLEAN_FALSE = 2,
147  I8 = 3,
148  I16 = 4,
149  I32 = 5,
150  I64 = 6,
151  DOUBLE = 7,
152  BINARY = 8,
153  LIST = 9,
154  SET = 10,
155  MAP = 11,
156  STRUCT = 12,
157  UUID = 13,
158 };
159 
165  uint32_t magic;
166 };
167 
171 struct file_ender_s {
173  uint32_t footer_len;
175  uint32_t magic;
176 };
177 
183 struct DecimalType {
185  int32_t scale = 0;
187  int32_t precision = 0;
188 };
189 
193 struct TimeUnit {
195  enum Type : uint8_t { UNDEFINED, MILLIS, MICROS, NANOS };
198 };
199 
205 struct TimeType {
208  bool isAdjustedToUTC = true;
210  TimeUnit unit = {TimeUnit::Type::MILLIS};
211 };
212 
221  bool isAdjustedToUTC = true;
223  TimeUnit unit = {TimeUnit::Type::MILLIS};
224 };
225 
231 struct IntType {
233  int8_t bitWidth = 0;
235  bool isSigned = false;
236 };
237 
241 struct LogicalType {
243  enum Type : uint8_t {
244  UNDEFINED,
245  STRING,
246  MAP,
247  LIST,
248  ENUM,
249  DECIMAL,
250  DATE,
251  TIME,
252  TIMESTAMP,
253  // 9 is reserved
254  INTEGER = 10,
255  UNKNOWN,
256  JSON,
257  BSON,
258  VARIANT = 16,
259  };
260 
264  cuda::std::optional<DecimalType> decimal_type;
266  cuda::std::optional<TimeType> time_type;
268  cuda::std::optional<TimestampType> timestamp_type;
270  cuda::std::optional<IntType> int_type;
271 
277  LogicalType(Type tp = Type::UNDEFINED) : type(tp) {}
278 
284  LogicalType(DecimalType&& dt) : type(DECIMAL), decimal_type(dt) {}
285 
291  LogicalType(TimeType&& tt) : type(TIME), time_type(tt) {}
292 
298  LogicalType(TimestampType&& tst) : type(TIMESTAMP), timestamp_type(tst) {}
299 
305  LogicalType(IntType&& it) : type(INTEGER), int_type(it) {}
306 
312  [[nodiscard]] CUDF_HOST_DEVICE constexpr bool is_time_millis() const
313  {
314  return type == TIME and time_type->unit.type == TimeUnit::MILLIS;
315  }
316 
322  [[nodiscard]] CUDF_HOST_DEVICE constexpr bool is_time_micros() const
323  {
324  return type == TIME and time_type->unit.type == TimeUnit::MICROS;
325  }
326 
332  [[nodiscard]] CUDF_HOST_DEVICE constexpr bool is_time_nanos() const
333  {
334  return type == TIME and time_type->unit.type == TimeUnit::NANOS;
335  }
336 
342  [[nodiscard]] CUDF_HOST_DEVICE constexpr bool is_timestamp_millis() const
343  {
344  return type == TIMESTAMP and timestamp_type->unit.type == TimeUnit::MILLIS;
345  }
346 
352  [[nodiscard]] CUDF_HOST_DEVICE constexpr bool is_timestamp_micros() const
353  {
354  return type == TIMESTAMP and timestamp_type->unit.type == TimeUnit::MICROS;
355  }
356 
362  [[nodiscard]] CUDF_HOST_DEVICE constexpr bool is_timestamp_nanos() const
363  {
364  return type == TIMESTAMP and timestamp_type->unit.type == TimeUnit::NANOS;
365  }
366 
372  [[nodiscard]] CUDF_HOST_DEVICE constexpr int8_t bit_width() const
373  {
374  return type == INTEGER ? int_type->bitWidth : -1;
375  }
376 
382  [[nodiscard]] constexpr bool is_signed() const { return type == INTEGER and int_type->isSigned; }
383 
389  [[nodiscard]] constexpr int32_t scale() const
390  {
391  return type == DECIMAL ? decimal_type->scale : -1;
392  }
393 
399  [[nodiscard]] CUDF_HOST_DEVICE constexpr int32_t precision() const
400  {
401  return type == DECIMAL ? decimal_type->precision : -1;
402  }
403 };
404 
408 struct ColumnOrder {
410  enum Type : uint8_t { UNDEFINED, TYPE_ORDER };
413 };
414 
423  Type type = Type::UNDEFINED;
425  int32_t type_length = 0;
427  FieldRepetitionType repetition_type = FieldRepetitionType::REQUIRED;
429  std::string name = "";
431  int32_t num_children = 0;
433  std::optional<ConvertedType> converted_type;
435  int32_t decimal_scale = 0;
437  int32_t decimal_precision = 0;
439  std::optional<int32_t> field_id;
441  cuda::std::optional<LogicalType> logical_type;
442 
444  bool output_as_byte_array = false;
445 
447  std::optional<type_id> arrow_type;
448 
449  // The following fields are filled in later during schema initialization
450 
452  int max_definition_level = 0;
454  int max_repetition_level = 0;
456  size_type parent_idx = 0;
458  std::vector<size_type> children_idx;
459 
466  bool operator==(SchemaElement const& other) const
467  {
468  return type == other.type && converted_type == other.converted_type &&
469  type_length == other.type_length && name == other.name &&
470  num_children == other.num_children && decimal_scale == other.decimal_scale &&
471  decimal_precision == other.decimal_precision && field_id == other.field_id;
472  }
473 
474  // the parquet format is a little squishy when it comes to interpreting
475  // repeated fields. sometimes repeated fields act as "stubs" in the schema
476  // that don't represent a true nesting level.
477  //
478  // this is the case with plain lists:
479  //
480  // optional group my_list (LIST) {
481  // repeated group element { <-- not part of the output hierarchy
482  // required binary str (UTF8);
483  // };
484  // }
485  //
486  // However, for backwards compatibility reasons, there are a few special cases, namely
487  // List<Struct<>> (which also corresponds to how the map type is specified), where
488  // this does not hold true
489  //
490  // optional group my_list (LIST) {
491  // repeated group element { <-- part of the hierarchy because it represents a struct
492  // required binary str (UTF8);
493  // required int32 num;
494  // };
495  // }
496 
526  [[nodiscard]] bool is_stub() const
527  {
528  auto const is_list_or_map_logical_type =
529  logical_type.has_value() &&
530  (logical_type->type == LogicalType::LIST || logical_type->type == LogicalType::MAP);
531  return repetition_type == FieldRepetitionType::REPEATED && num_children == 1 &&
532  converted_type != ConvertedType::LIST && converted_type != ConvertedType::MAP &&
533  !is_list_or_map_logical_type;
534  }
535 
546  [[nodiscard]] bool is_one_level_list(SchemaElement const& parent) const
547  {
548  return repetition_type == FieldRepetitionType::REPEATED and num_children == 0 and
549  not parent.is_list();
550  }
551 
557  [[nodiscard]] bool is_list() const { return converted_type == ConvertedType::LIST; }
558 
567  [[nodiscard]] bool is_struct() const
568  {
569  return type == Type::UNDEFINED &&
570  // this assumption might be a little weak.
571  ((repetition_type != FieldRepetitionType::REPEATED) ||
572  (repetition_type == FieldRepetitionType::REPEATED && num_children > 1));
573  }
574 };
575 
579 struct Statistics {
581  std::optional<std::vector<uint8_t>> max;
583  std::optional<std::vector<uint8_t>> min;
585  std::optional<int64_t> null_count;
587  std::optional<int64_t> distinct_count;
589  std::optional<std::vector<uint8_t>> max_value;
591  std::optional<std::vector<uint8_t>> min_value;
593  std::optional<bool> is_max_value_exact;
595  std::optional<bool> is_min_value_exact;
596 };
597 
604  std::optional<int64_t> unencoded_byte_array_data_bytes;
613  std::optional<std::vector<int64_t>> repetition_level_histogram;
614 
620  std::optional<std::vector<int64_t>> definition_level_histogram;
621 };
622 
627 struct PageLocation {
629  int64_t offset;
635 };
636 
640 struct OffsetIndex {
642  std::vector<PageLocation> page_locations;
645  std::optional<std::vector<int64_t>> unencoded_byte_array_data_bytes;
646 };
647 
651 struct ColumnIndex {
653  std::vector<bool> null_pages;
655  std::vector<std::vector<uint8_t>> min_values;
657  std::vector<std::vector<uint8_t>> max_values;
659  BoundaryOrder boundary_order = BoundaryOrder::UNORDERED;
661  std::optional<std::vector<int64_t>> null_counts;
663  std::optional<std::vector<int64_t>> repetition_level_histogram;
665  std::optional<std::vector<int64_t>> definition_level_histogram;
666 };
667 
677  int32_t count;
678 };
679 
685  int32_t column_idx;
690 };
691 
697  Type type = Type::BOOLEAN;
700  std::vector<Encoding> encodings;
702  std::vector<std::string> path_in_schema;
704  Compression codec = Compression::UNCOMPRESSED;
706  int64_t num_values = 0;
708  int64_t total_uncompressed_size = 0;
710  int64_t total_compressed_size = 0;
712  int64_t data_page_offset = 0;
714  int64_t index_page_offset = 0;
716  int64_t dictionary_page_offset = 0;
721  std::optional<std::vector<PageEncodingStats>> encoding_stats;
723  std::optional<int64_t> bloom_filter_offset;
728  std::optional<int32_t> bloom_filter_length;
732  std::optional<SizeStatistics> size_statistics;
733 };
734 
740  enum Algorithm : uint8_t { UNDEFINED, SPLIT_BLOCK };
742  Algorithm algorithm{Algorithm::SPLIT_BLOCK};
743 };
744 
750  enum Hash : uint8_t { UNDEFINED, XXHASH };
752  Hash hash{Hash::XXHASH};
753 };
754 
760  enum Compression : uint8_t { UNDEFINED, UNCOMPRESSED };
762  Compression compression{Compression::UNCOMPRESSED};
763 };
764 
773  int32_t num_bytes;
780 };
781 
790 struct ColumnChunk {
793  std::string file_path = "";
795  int64_t file_offset = 0;
800  int64_t offset_index_offset = 0;
802  int32_t offset_index_length = 0;
804  int64_t column_index_offset = 0;
806  int32_t column_index_length = 0;
807 
808  // Following fields are derived from other fields
809 
811  int schema_idx = -1;
812 
813  // The indexes don't really live here, but it's a convenient place to hang them.
814 
816  std::optional<OffsetIndex> offset_index;
818  std::optional<ColumnIndex> column_index;
819 };
820 
827 struct RowGroup {
829  std::vector<ColumnChunk> columns;
831  int64_t total_byte_size = 0;
833  int64_t num_rows = 0;
835  std::optional<std::vector<SortingColumn>> sorting_columns;
837  std::optional<int64_t> file_offset;
839  std::optional<int64_t> total_compressed_size;
841  std::optional<int16_t> ordinal;
842 };
843 
847 struct KeyValue {
849  std::string key;
851  std::string value;
852 };
853 
861 struct FileMetaData {
863  int32_t version = 0;
868  std::vector<SchemaElement> schema;
870  int64_t num_rows = 0;
872  std::vector<RowGroup> row_groups;
874  std::vector<KeyValue> key_value_metadata;
876  std::string created_by = "";
879  std::optional<std::vector<ColumnOrder>> column_orders;
880 };
881 
887  int32_t num_values = 0;
889  Encoding encoding = Encoding::PLAIN;
891  Encoding definition_level_encoding = Encoding::PLAIN;
893  Encoding repetition_level_encoding = Encoding::PLAIN;
894 };
895 
901  int32_t num_values = 0;
903  int32_t num_nulls = 0;
906  int32_t num_rows = 0;
908  Encoding encoding = Encoding::PLAIN;
910  int32_t definition_levels_byte_length = 0;
912  int32_t repetition_levels_byte_length = 0;
914  bool is_compressed = true;
915 };
916 
922  int32_t num_values = 0;
924  Encoding encoding = Encoding::PLAIN;
925 };
926 
936 struct PageHeader {
938  PageType type = PageType::DATA_PAGE;
940  int32_t uncompressed_page_size = 0;
942  int32_t compressed_page_size = 0;
943 
944  // Headers for page specific data. One only will be set.
945 
952 };
953  // end of group
955 } // namespace io::parquet
956 } // namespace CUDF_EXPORT cudf
ConvertedType
High-level data types in Parquet, determines how data is logically interpreted.
FieldRepetitionType
Compression codec used for compressed data pages.
PageType
Types of pages.
Encoding
Encoding types for the actual data stream.
Type
Basic data types in Parquet, determines how data is physically stored.
FieldType
Thrift compact protocol struct field types.
Compression
Compression codec used for compressed data pages.
BoundaryOrder
Enum to annotate whether lists of min/max elements inside ColumnIndex are ordered and if so,...
int32_t size_type
Row index type for columns and tables.
Definition: types.hpp:84
cuDF interfaces
Definition: host_udf.hpp:26
The algorithm used in bloom filter.
Algorithm
Available bloom filter algorithms.
The compression used in the bloom filter.
Compression
Available bloom filter compression types.
The hash function used in Bloom filter.
Hash
Available bloom filter hashers.
Bloom filter header struct.
BloomFilterCompression compression
The compression used in the bloom filter.
BloomFilterHash hash
The hash function used for bloom filter.
BloomFilterAlgorithm algorithm
The algorithm for setting bits.
int32_t num_bytes
The size of bitset in bytes.
Thrift-derived struct describing a column chunk.
std::optional< std::vector< PageEncodingStats > > encoding_stats
Statistics statistics
Optional statistics for this column chunk.
std::optional< int64_t > bloom_filter_offset
Byte offset from beginning of file to Bloom filter data.
std::optional< int32_t > bloom_filter_length
std::optional< SizeStatistics > size_statistics
std::vector< std::string > path_in_schema
Path in schema.
Thrift-derived struct describing a chunk of data for a particular column.
std::optional< ColumnIndex > column_index
ColumnIndex for this column chunk
std::optional< OffsetIndex > offset_index
OffsetIndex for this column chunk
Thrift-derived struct describing the column index.
std::optional< std::vector< int64_t > > definition_level_histogram
Definition level histogram for the column chunk.
std::optional< std::vector< int64_t > > null_counts
Optional count of null values per page.
std::vector< std::vector< uint8_t > > max_values
Upper bound for values in each page.
std::optional< std::vector< int64_t > > repetition_level_histogram
Repetition level histogram for the column chunk.
std::vector< bool > null_pages
Boolean used to determine if a page contains only null values.
std::vector< std::vector< uint8_t > > min_values
Lower bound for values in each page.
Union to specify the order used for the min_value and max_value fields for a column.
Type
Available column order types.
Type type
Column order type.
Thrift-derived struct describing the header for a V2 data page.
Thrift-derived struct describing the header for a data page.
Struct that describes the decimal logical type annotation.
Thrift-derived struct describing the header for a dictionary page.
Thrift-derived struct describing file-level metadata.
std::optional< std::vector< ColumnOrder > > column_orders
std::vector< RowGroup > row_groups
Row groups in this file.
std::vector< KeyValue > key_value_metadata
Optional key/value metadata.
std::vector< SchemaElement > schema
Struct that describes the integer logical type annotation.
Thrift-derived struct describing a key-value pair, for user metadata.
std::string key
string key
std::string value
string value
Struct that describes the logical type annotation.
constexpr CUDF_HOST_DEVICE bool is_time_millis() const
Check if the time is in milliseconds.
LogicalType(Type tp=Type::UNDEFINED)
Default constructor.
cuda::std::optional< IntType > int_type
Integer type.
cuda::std::optional< TimeType > time_type
Time type.
constexpr CUDF_HOST_DEVICE bool is_timestamp_millis() const
Check if the timestamp is in milliseconds.
constexpr CUDF_HOST_DEVICE bool is_timestamp_micros() const
Check if the timestamp is in microseconds.
constexpr int32_t scale() const
Get the scale of the decimal type.
constexpr CUDF_HOST_DEVICE bool is_time_nanos() const
Check if the time is in nanoseconds.
LogicalType(IntType &&it)
Constructor for Integer logical type.
Type
Logical type annotations to replace ConvertedType.
constexpr bool is_signed() const
Check if the integer is signed.
constexpr CUDF_HOST_DEVICE bool is_timestamp_nanos() const
Check if the timestamp is in nanoseconds.
cuda::std::optional< DecimalType > decimal_type
Decimal type.
LogicalType(TimeType &&tt)
Constructor for Time logical type.
cuda::std::optional< TimestampType > timestamp_type
Timestamp type.
LogicalType(TimestampType &&tst)
Constructor for Timestamp logical type.
constexpr CUDF_HOST_DEVICE int32_t precision() const
Get the precision of the decimal type.
constexpr CUDF_HOST_DEVICE int8_t bit_width() const
Get the bit width of the integer type.
constexpr CUDF_HOST_DEVICE bool is_time_micros() const
Check if the time is in microseconds.
LogicalType(DecimalType &&dt)
Constructor for Decimal logical type.
Thrift-derived struct describing the offset index.
std::vector< PageLocation > page_locations
Page locations.
std::optional< std::vector< int64_t > > unencoded_byte_array_data_bytes
Thrift-derived struct describing page encoding statistics.
Encoding encoding
Encoding of the page.
int32_t count
Number of pages of this type with this encoding.
PageType page_type
The page type (data/dic/...)
Thrift-derived struct describing the page header.
DataPageHeader data_page_header
Data page header.
DictionaryPageHeader dictionary_page_header
Dictionary page header.
DataPageHeaderV2 data_page_header_v2
V2 data page header.
Thrift-derived struct describing page location information stored in the offsets index.
int32_t compressed_page_size
Compressed page size in bytes plus the heeader length.
int64_t offset
Offset of the page in the file.
Thrift-derived struct describing a group of row data.
std::optional< int16_t > ordinal
Row group ordinal in the file.
std::optional< int64_t > file_offset
Byte offset from beginning of file to first page (data or dictionary) in this row group.
std::optional< std::vector< SortingColumn > > sorting_columns
If set, specifies a sort ordering of the rows in this RowGroup.
std::vector< ColumnChunk > columns
Metadata for each column chunk in this row group.
std::optional< int64_t > total_compressed_size
Total byte size of all compressed (and potentially encrypted) column data in this row group.
Struct for describing an element/field in the Parquet format schema.
Type type
1: parquet physical type for output
std::optional< type_id > arrow_type
cudf type determined from arrow:schema
int32_t decimal_precision
8: DEPRECATED: record the precision for DECIMAL converted type
std::optional< int32_t > field_id
9: save field_id from original schema
bool is_struct() const
Check if the schema element is a struct.
cuda::std::optional< LogicalType > logical_type
10: replaces converted type
std::string name
4: name of the field
int32_t decimal_scale
7: DEPRECATED: record the scale for DECIMAL converted type
bool is_stub() const
Check if the schema element is a stub.
bool is_one_level_list(SchemaElement const &parent) const
Check if the schema element is a one-level list.
int32_t num_children
5: nested fields
int32_t type_length
2: byte length of FIXED_LENGTH_BYTE_ARRAY elements, or maximum bit length for other types
std::vector< size_type > children_idx
Children indices.
std::optional< ConvertedType > converted_type
6: DEPRECATED: record the original type before conversion to parquet type
bool operator==(SchemaElement const &other) const
Check if two schema elements are equal.
bool is_list() const
Check if the schema element is a list.
Thrift-derived struct containing statistics used to estimate page and column chunk sizes.
std::optional< std::vector< int64_t > > repetition_level_histogram
std::optional< std::vector< int64_t > > definition_level_histogram
std::optional< int64_t > unencoded_byte_array_data_bytes
Thrift-derived struct describing column sort order.
bool nulls_first
If true, nulls will come before non-null values.
bool descending
If true, indicates this column is sorted in descending order.
int32_t column_idx
The column index (in this row group)
Thrift-derived struct describing column chunk statistics.
std::optional< bool > is_min_value_exact
If true, min_value is the actual minimum value for a column.
std::optional< std::vector< uint8_t > > max_value
max value for column determined by ColumnOrder
std::optional< int64_t > null_count
count of null values in the column
std::optional< std::vector< uint8_t > > max
deprecated max value in signed comparison order
std::optional< std::vector< uint8_t > > min_value
min value for column determined by ColumnOrder
std::optional< bool > is_max_value_exact
If true, max_value is the actual maximum value for a column.
std::optional< std::vector< uint8_t > > min
deprecated min value in signed comparison order
std::optional< int64_t > distinct_count
count of distinct values occurring
Struct that describes the time logical type annotation.
Time units for temporal logical types.
Type
Available time units.
Struct that describes the timestamp logical type annotation.
Struct that describes the Parquet file data postscript.
uint32_t footer_len
Length of the footer.
uint32_t magic
Parquet 4-byte magic number "PAR1".
Struct that describes the Parquet file data header.
uint32_t magic
Parquet 4-byte magic number "PAR1".
Type declarations for libcudf.
#define CUDF_HOST_DEVICE
Indicates that the function or method is usable on host and device.
Definition: types.hpp:21