nuno-faria commented on code in PR #25638:
URL: https://github.com/apache/datafusion/pull/25638#discussion_r4238807909


##########
datafusion-cli/src/functions.rs:
##########
@@ -363,6 +363,15 @@ impl TableFunctionImpl for ParquetMetadataFunc {
             Field::new("data_page_offset", DataType::Int64, true),
             Field::new("total_compressed_size", DataType::Int64, true),
             Field::new("total_uncompressed_size", DataType::Int64, true),
+            Field::new("bloom_filter_offset", DataType::Int64, true),
+            Field::new("bloom_filter_length", DataType::Int64, true),
+            Field::new("column_index_offset", DataType::Int64, true),
+            Field::new("column_index_length", DataType::Int64, true),
+            Field::new("offset_index_offset", DataType::Int64, true),
+            Field::new("offset_index_length", DataType::Int64, true),
+            Field::new("sorting_columns", DataType::Utf8, true),
+            Field::new("row_group_ordinal", DataType::Int64, true),
+            Field::new("row_group_file_offset", DataType::Int64, true),

Review Comment:
   Since these metrics are based on the row group, it might be better to move 
them near to the other row group metrics (i.e., after `row_group_bytes`).



##########
datafusion-cli/src/functions.rs:
##########
@@ -430,6 +449,19 @@ impl TableFunctionImpl for ParquetMetadataFunc {
                 data_page_offset_arr.push(column.data_page_offset());
                 total_compressed_size_arr.push(column.compressed_size());
                 total_uncompressed_size_arr.push(column.uncompressed_size());
+                bloom_filter_offset_arr.push(column.bloom_filter_offset());
+                bloom_filter_length_arr
+                    .push(column.bloom_filter_length().map(|v| v as i64));
+                column_index_offset_arr.push(column.column_index_offset());
+                column_index_length_arr
+                    .push(column.column_index_length().map(|v| v as i64));
+                offset_index_offset_arr.push(column.offset_index_offset());
+                offset_index_length_arr
+                    .push(column.offset_index_length().map(|v| v as i64));
+                sorting_columns_arr
+                    .push(row_group.sorting_columns().map(|cols| 
format!("{cols:?}")));
+                row_group_ordinal_arr.push(row_group.ordinal().map(|v| v as 
i64));

Review Comment:
   Is there a difference between the ordinal and the existing row_group_id?



##########
datafusion-cli/src/main.rs:
##########
@@ -609,11 +609,51 @@ mod tests {
         let rbs = df.collect().await?;
 
         assert_snapshot!(batches_to_string(&rbs),@r#"
-        
+-----------------------------------------------------------------+--------------+--------------------+-----------------------+-----------------+-----------+-------------+------------+----------------+------------+-----------+-----------+------------------+----------------------+-----------------+-----------------+--------------------+--------------------------+-------------------+------------------------+------------------+-----------------------+-------------------------+
-        | filename                                                        | 
row_group_id | row_group_num_rows | row_group_num_columns | row_group_bytes | 
column_id | file_offset | num_values | path_in_schema | type       | stats_min 
| stats_max | stats_null_count | stats_distinct_count | stats_min_value | 
stats_max_value | compression        | encodings                | 
index_page_offset | dictionary_page_offset | data_page_offset | 
total_compressed_size | total_uncompressed_size |
-        
+-----------------------------------------------------------------+--------------+--------------------+-----------------------+-----------------+-----------+-------------+------------+----------------+------------+-----------+-----------+------------------+----------------------+-----------------+-----------------+--------------------+--------------------------+-------------------+------------------------+------------------+-----------------------+-------------------------+
-        | ../parquet-testing/data/data_index_bloom_encoding_stats.parquet | 0  
          | 14                 | 1                     | 163             | 0    
     | 4           | 14         | "String"       | BYTE_ARRAY | Hello     | 
today     | 0                |                      | Hello           | today   
        | GZIP(GzipLevel(6)) | [PLAIN, RLE, BIT_PACKED] |                   |   
                     | 4                | 152                   | 163           
          |
-        
+-----------------------------------------------------------------+--------------+--------------------+-----------------------+-----------------+-----------+-------------+------------+----------------+------------+-----------+-----------+------------------+----------------------+-----------------+-----------------+--------------------+--------------------------+-------------------+------------------------+------------------+-----------------------+-------------------------+
+        
+-----------------------------------------------------------------+--------------+--------------------+-----------------------+-----------------+-----------+-------------+------------+----------------+------------+-----------+-----------+------------------+----------------------+-----------------+-----------------+--------------------+--------------------------+-------------------+------------------------+------------------+-----------------------+-------------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+-----------------+-------------------+-----------------------+
+        | filename                                                        | 
row_group_id | row_group_num_rows | row_group_num_columns | row_group_bytes | 
column_id | file_offset | num_values | path_in_schema | type       | stats_min 
| stats_max | stats_null_count | stats_distinct_count | stats_min_value | 
stats_max_value | compression        | encodings                | 
index_page_offset | dictionary_page_offset | data_page_offset | 
total_compressed_size | total_uncompressed_size | bloom_filter_offset | 
bloom_filter_length | column_index_offset | column_index_length | 
offset_index_offset | offset_index_length | sorting_columns | row_group_ordinal 
| row_group_file_offset |
+        
+-----------------------------------------------------------------+--------------+--------------------+-----------------------+-----------------+-----------+-------------+------------+----------------+------------+-----------+-----------+------------------+----------------------+-----------------+-----------------+--------------------+--------------------------+-------------------+------------------------+------------------+-----------------------+-------------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+-----------------+-------------------+-----------------------+
+        | ../parquet-testing/data/data_index_bloom_encoding_stats.parquet | 0  
          | 14                 | 1                     | 163             | 0    
     | 4           | 14         | "String"       | BYTE_ARRAY | Hello     | 
today     | 0                |                      | Hello           | today   
        | GZIP(GzipLevel(6)) | [PLAIN, RLE, BIT_PACKED] |                   |   
                     | 4                | 152                   | 163           
          | 192                 |                     | 156                 | 
25                  | 181                 | 11                  |               
  | 0                 | 4                     |
+        
+-----------------------------------------------------------------+--------------+--------------------+-----------------------+-----------------+-----------+-------------+------------+----------------+------------+-----------+-----------+------------------+----------------------+-----------------+-----------------+--------------------+--------------------------+-------------------+------------------------+------------------+-----------------------+-------------------------+---------------------+---------------------+---------------------+---------------------+---------------------+---------------------+-----------------+-------------------+-----------------------+
+        "#);
+
+        Ok(())
+    }
+
+    /// `bloom_filter_length` and `sorting_columns` are absent from the other
+    /// fixtures. These files populate them so a regression that always emits
+    /// NULL still fails.
+    #[tokio::test]
+    async fn test_parquet_metadata_bloom_length_and_sorting_columns()
+    -> Result<(), DataFusionError> {
+        let ctx = SessionContext::new();
+        ctx.register_udtf("parquet_metadata", Arc::new(ParquetMetadataFunc 
{}));
+
+        let sql = "SELECT path_in_schema, bloom_filter_offset, 
bloom_filter_length \
+            FROM 
parquet_metadata('../parquet-testing/data/data_index_bloom_encoding_with_length.parquet')";
+        let df = ctx.sql(sql).await?;
+        let rbs = df.collect().await?;
+        assert_snapshot!(batches_to_string(&rbs), @r#"
+        +----------------+---------------------+---------------------+
+        | path_in_schema | bloom_filter_offset | bloom_filter_length |
+        +----------------+---------------------+---------------------+
+        | "String"       | 253                 | 2064                |
+        +----------------+---------------------+---------------------+
+        "#);
+
+        let sql = "SELECT row_group_id, column_id, path_in_schema, 
sorting_columns \
+            FROM 
parquet_metadata('../parquet-testing/data/sort_columns.parquet') \
+            ORDER BY row_group_id, column_id";
+        let df = ctx.sql(sql).await?;
+        let rbs = df.collect().await?;
+        assert_snapshot!(batches_to_string(&rbs), @r#"
+        
+--------------+-----------+----------------+------------------------------------------------------------------------------------------------------------------------------------------------+
+        | row_group_id | column_id | path_in_schema | sorting_columns          
                                                                                
                                      |
+        
+--------------+-----------+----------------+------------------------------------------------------------------------------------------------------------------------------------------------+
+        | 0            | 0         | "a"            | [SortingColumn { 
column_idx: 0, descending: true, nulls_first: true }, SortingColumn { 
column_idx: 1, descending: false, nulls_first: false }] |

Review Comment:
   I think the current `sorting_columns` is difficult to read. To me at least I 
would prefer the column names instead. E.g.:
   `[SortingColumn { column_idx: 0, descending: true, nulls_first: true }, 
SortingColumn { column_idx: 1, descending: false, nulls_first: false }]`
   vs
   `col1 DESC NULLS FIRST, col2 ASC`



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to