1717
1818//! Options related to how parquet files should be written
1919
20- use crate :: { config:: TableParquetOptions , DataFusionError , Result } ;
20+ use crate :: {
21+ config:: { ParquetOptions , TableParquetOptions } ,
22+ DataFusionError , Result ,
23+ } ;
2124
2225use parquet:: {
2326 basic:: { BrotliLevel , GzipLevel , ZstdLevel } ,
24- file:: properties:: { EnabledStatistics , WriterProperties , WriterVersion } ,
27+ file:: {
28+ metadata:: KeyValue ,
29+ properties:: { EnabledStatistics , WriterProperties , WriterVersion } ,
30+ } ,
2531 schema:: types:: ColumnPath ,
2632} ;
2733
@@ -47,53 +53,87 @@ impl TryFrom<&TableParquetOptions> for ParquetWriterOptions {
4753 type Error = DataFusionError ;
4854
4955 fn try_from ( parquet_options : & TableParquetOptions ) -> Result < Self > {
50- let parquet_session_options = & parquet_options. global ;
51- let mut builder = WriterProperties :: builder ( )
52- . set_data_page_size_limit ( parquet_session_options. data_pagesize_limit )
53- . set_write_batch_size ( parquet_session_options. write_batch_size )
54- . set_writer_version ( parse_version_string (
55- & parquet_session_options. writer_version ,
56- ) ?)
57- . set_dictionary_page_size_limit (
58- parquet_session_options. dictionary_page_size_limit ,
59- )
60- . set_max_row_group_size ( parquet_session_options. max_row_group_size )
61- . set_created_by ( parquet_session_options. created_by . clone ( ) )
62- . set_column_index_truncate_length (
63- parquet_session_options. column_index_truncate_length ,
56+ let ParquetOptions {
57+ data_pagesize_limit,
58+ write_batch_size,
59+ writer_version,
60+ dictionary_page_size_limit,
61+ max_row_group_size,
62+ created_by,
63+ column_index_truncate_length,
64+ data_page_row_count_limit,
65+ bloom_filter_enabled,
66+ encoding,
67+ dictionary_enabled,
68+ compression,
69+ statistics_enabled,
70+ max_statistics_size,
71+ bloom_filter_fpp,
72+ bloom_filter_ndv,
73+ // below is not part of ParquetWriterOptions
74+ enable_page_index : _,
75+ pruning : _,
76+ skip_metadata : _,
77+ metadata_size_hint : _,
78+ pushdown_filters : _,
79+ reorder_filters : _,
80+ allow_single_file_parallelism : _,
81+ maximum_parallel_row_group_writers : _,
82+ maximum_buffered_record_batches_per_stream : _,
83+ } = & parquet_options. global ;
84+
85+ let key_value_metadata = if !parquet_options. key_value_metadata . is_empty ( ) {
86+ Some (
87+ parquet_options
88+ . key_value_metadata
89+ . clone ( )
90+ . drain ( )
91+ . map ( |( key, value) | KeyValue { key, value } )
92+ . collect :: < Vec < _ > > ( ) ,
6493 )
65- . set_data_page_row_count_limit (
66- parquet_session_options. data_page_row_count_limit ,
67- )
68- . set_bloom_filter_enabled ( parquet_session_options. bloom_filter_enabled ) ;
94+ } else {
95+ None
96+ } ;
6997
70- if let Some ( encoding) = & parquet_session_options. encoding {
98+ let mut builder = WriterProperties :: builder ( )
99+ . set_data_page_size_limit ( * data_pagesize_limit)
100+ . set_write_batch_size ( * write_batch_size)
101+ . set_writer_version ( parse_version_string ( writer_version. as_str ( ) ) ?)
102+ . set_dictionary_page_size_limit ( * dictionary_page_size_limit)
103+ . set_max_row_group_size ( * max_row_group_size)
104+ . set_created_by ( created_by. clone ( ) )
105+ . set_column_index_truncate_length ( * column_index_truncate_length)
106+ . set_data_page_row_count_limit ( * data_page_row_count_limit)
107+ . set_bloom_filter_enabled ( * bloom_filter_enabled)
108+ . set_key_value_metadata ( key_value_metadata) ;
109+
110+ if let Some ( encoding) = & encoding {
71111 builder = builder. set_encoding ( parse_encoding_string ( encoding) ?) ;
72112 }
73113
74- if let Some ( enabled) = parquet_session_options . dictionary_enabled {
75- builder = builder. set_dictionary_enabled ( enabled) ;
114+ if let Some ( enabled) = dictionary_enabled {
115+ builder = builder. set_dictionary_enabled ( * enabled) ;
76116 }
77117
78- if let Some ( compression) = & parquet_session_options . compression {
118+ if let Some ( compression) = & compression {
79119 builder = builder. set_compression ( parse_compression_string ( compression) ?) ;
80120 }
81121
82- if let Some ( statistics) = & parquet_session_options . statistics_enabled {
122+ if let Some ( statistics) = & statistics_enabled {
83123 builder =
84124 builder. set_statistics_enabled ( parse_statistics_string ( statistics) ?) ;
85125 }
86126
87- if let Some ( size) = parquet_session_options . max_statistics_size {
88- builder = builder. set_max_statistics_size ( size) ;
127+ if let Some ( size) = max_statistics_size {
128+ builder = builder. set_max_statistics_size ( * size) ;
89129 }
90130
91- if let Some ( fpp) = parquet_session_options . bloom_filter_fpp {
92- builder = builder. set_bloom_filter_fpp ( fpp) ;
131+ if let Some ( fpp) = bloom_filter_fpp {
132+ builder = builder. set_bloom_filter_fpp ( * fpp) ;
93133 }
94134
95- if let Some ( ndv) = parquet_session_options . bloom_filter_ndv {
96- builder = builder. set_bloom_filter_ndv ( ndv) ;
135+ if let Some ( ndv) = bloom_filter_ndv {
136+ builder = builder. set_bloom_filter_ndv ( * ndv) ;
97137 }
98138
99139 for ( column, options) in & parquet_options. column_specific_options {
@@ -141,6 +181,8 @@ impl TryFrom<&TableParquetOptions> for ParquetWriterOptions {
141181 builder. set_column_max_statistics_size ( path, max_statistics_size) ;
142182 }
143183 }
184+
185+ // ParquetWriterOptions will have defaults for the remaining fields (e.g. sorting_columns)
144186 Ok ( ParquetWriterOptions {
145187 writer_options : builder. build ( ) ,
146188 } )
0 commit comments