This is an automated email from the ASF dual-hosted git repository.

comphead pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git


The following commit(s) were added to refs/heads/main by this push:
     new 192079e4a7 Improve documentation on start_demuxer_task and 
file_extension (#13216)
192079e4a7 is described below

commit 192079e4a73084c045646b36d2ef8f9907aa21ff
Author: Andrew Lamb <[email protected]>
AuthorDate: Thu Nov 7 20:46:19 2024 -0500

    Improve documentation on start_demuxer_task and file_extension (#13216)
---
 .../core/src/datasource/file_format/write/demux.rs | 40 +++++++++++++++-------
 datafusion/core/src/datasource/listing/url.rs      | 11 ++++++
 2 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/datafusion/core/src/datasource/file_format/write/demux.rs 
b/datafusion/core/src/datasource/file_format/write/demux.rs
index b03676d532..56ded495c8 100644
--- a/datafusion/core/src/datasource/file_format/write/demux.rs
+++ b/datafusion/core/src/datasource/file_format/write/demux.rs
@@ -52,18 +52,33 @@ type RecordBatchReceiver = Receiver<RecordBatch>;
 type DemuxedStreamReceiver = UnboundedReceiver<(Path, RecordBatchReceiver)>;
 
 /// Splits a single [SendableRecordBatchStream] into a dynamically determined
-/// number of partitions at execution time. The partitions are determined by
-/// factors known only at execution time, such as total number of rows and
-/// partition column values. The demuxer task communicates to the caller
-/// by sending channels over a channel. The inner channels send RecordBatches
-/// which should be contained within the same output file. The outer channel
-/// is used to send a dynamic number of inner channels, representing a dynamic
-/// number of total output files. The caller is also responsible to monitor
-/// the demux task for errors and abort accordingly. A path with an extension 
will
-/// force only a single file to be written with the extension from the path. 
Otherwise
-/// the default extension will be used and the output will be split into 
multiple files.
-/// partition_by parameter will additionally split the input based on the 
unique
-/// values of a specific column 
`<https://github.com/apache/datafusion/issues/7744>``
+/// number of partitions at execution time.
+///
+/// The partitions are determined by factors known only at execution time, such
+/// as total number of rows and partition column values. The demuxer task
+/// communicates to the caller by sending channels over a channel. The inner
+/// channels send RecordBatches which should be contained within the same 
output
+/// file. The outer channel is used to send a dynamic number of inner channels,
+/// representing a dynamic number of total output files.
+///
+/// The caller is also responsible to monitor the demux task for errors and
+/// abort accordingly.
+///
+/// A path with an extension will force only a single file to
+/// be written with the extension from the path. Otherwise the default 
extension
+/// will be used and the output will be split into multiple files.
+///
+/// Examples of `base_output_path`
+///  * `tmp/dataset/` -> is a folder since it ends in `/`
+///  * `tmp/dataset` -> is still a folder since it does not end in `/` but has 
no valid file extension
+///  * `tmp/file.parquet` -> is a file since it does not end in `/` and has a 
valid file extension `.parquet`
+///  * `tmp/file.parquet/` -> is a folder since it ends in `/`
+///
+/// The `partition_by` parameter will additionally split the input based on the
+/// unique values of a specific column, see
+/// <https://github.com/apache/datafusion/issues/7744>
+///
+/// ```text
 ///                                                                            
  ┌───────────┐               ┌────────────┐    ┌─────────────┐
 ///                                                                     
┌──────▶ │  batch 1  ├────▶...──────▶│   Batch a  │    │ Output File1│
 ///                                                                     │      
  └───────────┘               └────────────┘    └─────────────┘
@@ -75,6 +90,7 @@ type DemuxedStreamReceiver = UnboundedReceiver<(Path, 
RecordBatchReceiver)>;
 ///                                                 └──────────┘        │      
  ┌───────────┐               ┌────────────┐    ┌─────────────┐
 ///                                                                     
└──────▶ │  batch d  ├────▶...──────▶│   Batch n  │    │ Output FileN│
 ///                                                                            
  └───────────┘               └────────────┘    └─────────────┘
+/// ```
 pub(crate) fn start_demuxer_task(
     input: SendableRecordBatchStream,
     context: &Arc<TaskContext>,
diff --git a/datafusion/core/src/datasource/listing/url.rs 
b/datafusion/core/src/datasource/listing/url.rs
index e627cacfbf..2e8d314354 100644
--- a/datafusion/core/src/datasource/listing/url.rs
+++ b/datafusion/core/src/datasource/listing/url.rs
@@ -191,6 +191,17 @@ impl ListingTableUrl {
     }
 
     /// Returns the file extension of the last path segment if it exists
+    ///
+    /// Examples:
+    /// ```rust
+    /// use datafusion::datasource::listing::ListingTableUrl;
+    /// let url = ListingTableUrl::parse("file:///foo/bar.csv").unwrap();
+    /// assert_eq!(url.file_extension(), Some("csv"));
+    /// let url = ListingTableUrl::parse("file:///foo/bar").unwrap();
+    /// assert_eq!(url.file_extension(), None);
+    /// let url = ListingTableUrl::parse("file:///foo/bar.").unwrap();
+    /// assert_eq!(url.file_extension(), None);
+    /// ```
     pub fn file_extension(&self) -> Option<&str> {
         if let Some(segments) = self.url.path_segments() {
             if let Some(last_segment) = segments.last() {


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

Reply via email to