Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions cpp/include/cudf/io/parquet_schema.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -667,6 +667,8 @@ struct Statistics {
std::optional<bool> is_max_value_exact;
/// If true, min_value is the actual minimum value for a column
std::optional<bool> is_min_value_exact;
/// count of NaN values in a floating point column. NaNs may be present if absent
std::optional<int64_t> nan_count;
};

/**
Expand Down Expand Up @@ -737,6 +739,8 @@ struct ColumnIndex {
std::optional<std::vector<int64_t>> repetition_level_histogram;
/// Definition level histogram for the column chunk
std::optional<std::vector<int64_t>> definition_level_histogram;
/// Optional count of NaN values per page of a floating point column
std::optional<std::vector<int64_t>> nan_counts;
};

/**
Expand Down
6 changes: 4 additions & 2 deletions cpp/src/io/parquet/compact_protocol_reader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1040,7 +1040,8 @@ void CompactProtocolReader::read(ColumnIndex* c)
parquet_field_enum<BoundaryOrder>(4, c->boundary_order),
optional_list_i64(5, c->null_counts),
optional_list_i64(6, c->repetition_level_histogram),
optional_list_i64(7, c->definition_level_histogram));
optional_list_i64(7, c->definition_level_histogram),
optional_list_i64(8, c->nan_counts));
function_builder(this, op);
}

Expand All @@ -1057,7 +1058,8 @@ void CompactProtocolReader::read(Statistics* s)
optional_binary(5, s->max_value),
optional_binary(6, s->min_value),
optional_bool(7, s->is_max_value_exact),
optional_bool(8, s->is_min_value_exact));
optional_bool(8, s->is_min_value_exact),
optional_int64(9, s->nan_count));
function_builder(this, op);
}

Expand Down
1 change: 1 addition & 0 deletions cpp/src/io/parquet/compact_protocol_writer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,7 @@ size_t CompactProtocolWriter::write(Statistics const& s)
if (s.min_value.has_value()) { c.field_binary(6, s.min_value.value()); }
if (s.is_max_value_exact.has_value()) { c.field_bool(7, s.is_max_value_exact.value()); }
if (s.is_min_value_exact.has_value()) { c.field_bool(8, s.is_min_value_exact.value()); }
if (s.nan_count.has_value()) { c.field_int(9, s.nan_count.value()); }
return c.value();
}

Expand Down
12 changes: 8 additions & 4 deletions cpp/tests/io/experimental/parquet_footer_facade_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ FileMetaData const& make_test_footer()
.repetition_type = FieldRepetitionType::REQUIRED,
.name = "schema",
.num_children = 3},
{.type = Type::INT32,
{.type = Type::DOUBLE,
.repetition_type = FieldRepetitionType::OPTIONAL,
.name = "a",
.field_id = 1},
Expand All @@ -66,7 +66,7 @@ FileMetaData const& make_test_footer()

ColumnChunk const cc[] = {
{.file_offset = 4,
.meta_data = {.type = Type::INT32,
.meta_data = {.type = Type::DOUBLE,
.encodings = {Encoding::PLAIN, Encoding::RLE_DICTIONARY},
.path_in_schema = {"a"},
.codec = Compression::SNAPPY,
Expand All @@ -75,7 +75,8 @@ FileMetaData const& make_test_footer()
.total_compressed_size = 500,
.data_page_offset = 8,
// non-zero exercises the dictionary_page_offset field
.dictionary_page_offset = 4}},
.dictionary_page_offset = 4,
.statistics = {.null_count = 0, .nan_count = 3}}},
{.file_offset = 504,
.meta_data = {.type = Type::BYTE_ARRAY,
.encodings = {Encoding::PLAIN},
Expand All @@ -99,7 +100,8 @@ FileMetaData const& make_test_footer()
{"empty", std::string("")},
{"novalue", std::nullopt},
};
meta.column_orders = {{{ColumnOrder::TYPE_ORDER}, {ColumnOrder::TYPE_ORDER}}};
meta.column_orders = {
{{ColumnOrder::IEEE_754_TOTAL_ORDER}, {ColumnOrder::TYPE_ORDER}, {ColumnOrder::TYPE_ORDER}}};

return meta;
}();
Expand Down Expand Up @@ -137,6 +139,8 @@ void expect_column_meta_equal(ColumnChunkMetaData const& e, ColumnChunkMetaData
EXPECT_EQ(e.data_page_offset, a.data_page_offset);
EXPECT_EQ(e.index_page_offset, a.index_page_offset);
EXPECT_EQ(e.dictionary_page_offset, a.dictionary_page_offset);
EXPECT_EQ(e.statistics.null_count, a.statistics.null_count);
EXPECT_EQ(e.statistics.nan_count, a.statistics.nan_count);
}

void expect_column_chunk_equal(ColumnChunk const& e, ColumnChunk const& a)
Expand Down
Loading