Skip to content

Commit 20366af

Browse files
committed
Fix
1 parent 969575e commit 20366af

3 files changed

Lines changed: 33 additions & 6 deletions

File tree

cpp/src/io/parquet/parquet_gpu.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -589,8 +589,8 @@ struct EncColumnChunk {
589589
size_type num_dict_entries; //!< Total number of entries in dictionary
590590
size_type
591591
uniq_data_size; //!< Size of dictionary page (set of all unique values) if dict enc is used
592-
size_type plain_data_size; //!< Size of data in this chunk if plain encoding is used
593-
size_type* dict_data; //!< Dictionary data (unique row indices)
592+
size_t plain_data_size; //!< Size of data in this chunk if plain encoding is used
593+
size_type* dict_data; //!< Dictionary data (unique row indices)
594594
size_type* dict_index; //!< Index of value in dictionary page. column[dict_data[dict_index[row]]]
595595
uint8_t dict_rle_bits; //!< Bit size for encoding dictionary indices
596596
bool use_dictionary; //!< True if the chunk uses dictionary encoding

cpp/src/io/parquet/writer_impl.cu

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,7 +1369,8 @@ build_chunk_dictionaries(hostdevice_2dvector<EncColumnChunk>& chunks,
13691369
// bitpacking bitsize we efficiently support
13701370
if (nbits > MAX_DICT_BITS) { return {false, 0}; }
13711371

1372-
auto rle_byte_size = util::div_rounding_up_safe(ck.num_values * nbits, 8);
1372+
auto rle_byte_size =
1373+
util::div_rounding_up_safe<size_t>(static_cast<size_t>(ck.num_values) * nbits, 8);
13731374
auto dict_enc_size = ck.uniq_data_size + rle_byte_size;
13741375
if (ck.plain_data_size <= dict_enc_size) { return {false, 0}; }
13751376

@@ -1912,9 +1913,10 @@ auto convert_table_to_parquet_data(table_input_metadata& table_meta,
19121913
return l + r.num_values;
19131914
});
19141915
ck.plain_data_size = std::accumulate(
1915-
chunk_fragments.begin(), chunk_fragments.end(), 0, [](int sum, PageFragment frag) {
1916-
return sum + frag.fragment_data_size;
1917-
});
1916+
chunk_fragments.begin(),
1917+
chunk_fragments.end(),
1918+
size_t{0},
1919+
[](auto sum, PageFragment frag) { return sum + frag.fragment_data_size; });
19181920
auto& column_chunk_meta = row_group.columns[c].meta_data;
19191921
column_chunk_meta.type = parquet_columns[c].physical_type();
19201922
column_chunk_meta.path_in_schema = parquet_columns[c].get_path_in_schema();

python/pylibcudf/tests/io/test_parquet.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,31 @@ def test_write_parquet(
659659
assert isinstance(result, memoryview)
660660

661661

662+
def test_write_large_list_row_group():
663+
import cupy as cp
664+
665+
# 800k rows of list<float32>[1024] exceed the signed 32-bit range. The
666+
# writer must retain the correct plain-data size for dictionary selection.
667+
rows = 800_000
668+
embedding_dim = 1024
669+
values = cp.zeros((rows, embedding_dim), dtype=cp.float32)
670+
table = plc.Table(
671+
[plc.Column.from_cuda_array_interface(values)],
672+
num_rows=rows,
673+
)
674+
metadata = plc.io.types.TableInputMetadata(table)
675+
sink = plc.io.SinkInfo([io.BytesIO()])
676+
options = plc.io.parquet.ParquetWriterOptions.builder(sink, table).metadata(
677+
metadata
678+
).build()
679+
680+
result = plc.io.parquet.write_parquet(options)
681+
parquet_file = pq.ParquetFile(io.BytesIO(result))
682+
683+
assert parquet_file.metadata.num_rows == rows
684+
assert parquet_file.metadata.num_row_groups == 1
685+
686+
662687
@pytest.mark.parametrize("use_jit_filter", [False, True])
663688
@pytest.mark.parametrize(
664689
"pa_filter,plc_filter",

0 commit comments

Comments
 (0)