apache / apache/datafusion

Support Glob Expressions for S3

Abierto
#7,393 6 comentarios 1 reacción 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

enhancement
Lenguaje dominante
Rust
Estrellas
9.3k
Forks
2.4k
Merge medio
3 d 6 h
PR fusionados (30 d)
363

Descripción

Describe the bug

Im trying to register a listing table using a certain glob string:
s3://somebucket/somepath/*44fad0765ac6-00001.parquet
and receive the error

Error: Custom { kind: Other, error: 
"Object Store error: Object at location
 somepath/%2A44fad0765ac6-00001.parquet not found: 
response error \"No Body\", after 0 retries: HTTP status client error (404 Not Found) 
for url (https://s3.eu-west-1.amazonaws.com/somebucket/somepath/%252A44fad0765ac6-00001.parquet)" }

however, I know the file is there because the action succeeds when I just using the full file name
s3://somebucket/somepath/00000-2367-2918fbc9-ea04-4927-a669-44fad0765ac6-00001.parquet

from the error, I have a feeling it's related to how the url and gloc char is being encoded, looks like its being encoded twice for some reason - from * -> %2A -> %252A

To Reproduce
   let glob_str = "*44fad0765ac6-00001.parquet";
   let table_files = String::from("somepath");
   let table_files_path = format!("s3://{bucket_name}/{table_files}/{glob_str}");
   let table_files_url = ListingTableUrl::parse(&table_files_path)?;
   let schema_file_path = format!("s3://{bucket_name}/{table_files}/00000-2367-2918fbc9-ea04-4927-a669-44fad0765ac6-00001.parquet");
   let schema_file_url = ListingTableUrl::parse(&schema_file_path)?;
   println!("table_files_url: {}", table_files_path);
   
   let file_format = ParquetFormat::default()
.with_enable_pruning(Some(true));
   let listing_options = ListingOptions::new(Arc::new(file_format))
.with_file_extension(".parquet");
   
    let schema = listing_options.infer_schema(&ctx.state(), &schema_file_url).await?;


    let table_config = 
        ListingTableConfig::new(table_files_url) // the path of the files
        .with_listing_options(listing_options)
        .with_schema(schema);

    let table_provider = Arc::new(ListingTable::try_new(table_config).unwrap());

    ctx.register_table(TableReference::from("users"),table_provider).unwrap();
    let df = ctx.sql("SELECT count(*) FROM users").await?;
    df.show().await?;
    

Expected behavior

the files that correspond to the glob string will be registered as a table.
In the code above if I just switch between the ListingTableUrl with the globe string to that of the schema the code executes successfully (so no permissions issue)/

Additional context

My Cargo.Toml

aws-config = "0.55.3"
aws-sdk-s3 = "0.28.0"
object_store = { version = "0.6.1", features = ["aws"] }
url = "2.4.0"  
async-graphql = "6.0.4"
async-graphql-actix-web = { version = "6.0.4"}
actix-web =  { version = "4.3.1" }
datafusion = "28.0.0"
tokio = { version = "1.32.0", features = ["full"] }

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con las APIs ListingTableUrl, ListingOptions, ListingTableConfig e infer_schema mostradas en la reproducción de Rust y, a continuación, rastrea cómo la ruta de S3 que contiene el glob llega a las solicitudes de object-store. Confirma el comportamiento con las rutas proporcionadas de coincidencia y de archivo completo; se considera terminado cuando un glob como *44fad0765ac6-00001.parquet registra los archivos S3 coincidentes sin codificar dos veces el wildcard.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
aws, rust
Área
cloud, data
Tipo de issue
Nueva funcionalidad
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.