@@ -38,8 +38,13 @@ use datafusion_comet_spark_expr::EvalMode;
38
38
use object_store:: path:: Path ;
39
39
use object_store:: { parse_url, ObjectStore } ;
40
40
use std:: collections:: HashMap ;
41
+ use std:: path:: PathBuf ;
41
42
use std:: time:: Duration ;
42
- use std:: { fmt:: Debug , hash:: Hash , sync:: Arc } ;
43
+ use std:: {
44
+ fmt:: { Debug , Write } ,
45
+ hash:: Hash ,
46
+ sync:: Arc ,
47
+ } ;
43
48
use url:: Url ;
44
49
45
50
use super :: objectstore;
@@ -352,7 +357,42 @@ fn parse_hdfs_url(url: &Url) -> Result<(Box<dyn ObjectStore>, Path), object_stor
352
357
}
353
358
}
354
359
355
- #[ cfg( not( feature = "hdfs" ) ) ]
360
+ #[ cfg( feature = "hdfs-opendal" ) ]
361
+ fn parse_hdfs_url ( url : & Url ) -> Result < ( Box < dyn ObjectStore > , Path ) , object_store:: Error > {
362
+ let name_node = get_name_node_uri ( url) ?;
363
+ let builder = opendal:: services:: Hdfs :: default ( ) . name_node ( & name_node) ;
364
+
365
+ let op = opendal:: Operator :: new ( builder)
366
+ . map_err ( |error| object_store:: Error :: Generic {
367
+ store : "hdfs-opendal" ,
368
+ source : error. into ( ) ,
369
+ } ) ?
370
+ . finish ( ) ;
371
+ let store = object_store_opendal:: OpendalStore :: new ( op) ;
372
+ let path = Path :: parse ( url. path ( ) ) ?;
373
+ Ok ( ( Box :: new ( store) , path) )
374
+ }
375
+
376
+ fn get_name_node_uri ( url : & Url ) -> Result < String , object_store:: Error > {
377
+ if let Some ( host) = url. host ( ) {
378
+ let schema = url. scheme ( ) ;
379
+ let mut uri_builder = String :: new ( ) ;
380
+ write ! ( & mut uri_builder, "{schema}://{host}" ) . unwrap ( ) ;
381
+
382
+ if let Some ( port) = url. port ( ) {
383
+ write ! ( & mut uri_builder, ":{port}" ) . unwrap ( ) ;
384
+ }
385
+ Ok ( uri_builder)
386
+ } else {
387
+ Err ( object_store:: Error :: InvalidPath {
388
+ source : object_store:: path:: Error :: InvalidPath {
389
+ path : PathBuf :: from ( url. as_str ( ) ) ,
390
+ } ,
391
+ } )
392
+ }
393
+ }
394
+
395
+ #[ cfg( all( not( feature = "hdfs" ) , not( feature = "hdfs-opendal" ) ) ) ]
356
396
fn parse_hdfs_url ( _url : & Url ) -> Result < ( Box < dyn ObjectStore > , Path ) , object_store:: Error > {
357
397
Err ( object_store:: Error :: Generic {
358
398
store : "HadoopFileSystem" ,
0 commit comments