Загрузка вложенных CSV-файлов из S3 с помощью Spark

У меня есть сотни сжатых CSV-файлов в S3, которые я пытаюсь загрузить. Структура каталогов выглядит следующим образом:

bucket
-- level1
---- level2.1
-------- level3.1
------------ many files 
-------- level3.2
------------ many files 
---- level2.2
-------- level3.1
------------ many files 
-------- level3.2
------------ many files 

Там может быть несколько каталогов level2, level3 и много файлов под каждым. В прошлом я загружал данные, используя.textFile, и передавал путь с помощью подстановочного знака, например:

s3a://bucketname/level1/**

который работал нормально, чтобы загрузить все файлы по всем дочерним путям. Я сейчас пытаюсь использовать механизм загрузки CSV в спарк 2, и я получаю следующую ошибку:

java.lang.IllegalArgumentException: Can not create a Path from an empty string
at org.apache.hadoop.fs.Path.checkPathArg(Path.java:126)
at org.apache.hadoop.fs.Path.<init>(Path.java:134)
at org.apache.hadoop.util.StringUtils.stringToPath(StringUtils.java:245)
at org.apache.hadoop.mapred.FileInputFormat.setInputPaths(FileInputFormat.java:377)
at org.apache.spark.SparkContext$$anonfun$hadoopFile$1$$anonfun$30.apply(SparkContext.scala:1014)
at org.apache.spark.SparkContext$$anonfun$hadoopFile$1$$anonfun$30.apply(SparkContext.scala:1014)
at org.apache.spark.rdd.HadoopRDD$$anonfun$getJobConf$6.apply(HadoopRDD.scala:179)
at org.apache.spark.rdd.HadoopRDD$$anonfun$getJobConf$6.apply(HadoopRDD.scala:179)
at scala.Option.foreach(Option.scala:257)

Я пытался использовать следующие пути:

  1. S3A://bucketname/level1/**
  2. S3A: // bucketname / level1 /
  3. S3A: // bucketname / level1

Все приводят к одной и той же ошибке. Если я использую s3a://bucketname/level1/level2.1/level3.1/, это работает для загрузки всех файлов в этом одном каталоге, но если я пытаюсь использовать каталог более высокого уровня, это терпит неудачу.

Мой код для загрузки:

   Dataset<Row> csv = sparkSession.read()
            .option("delimiter", parseSettings.getDelimiter().toString())
            .option("quote", parseSettings.getQuote())
            .csv(path);

Я думаю, что загрузка csv использовала стандартную стратегию разрешения файлов, но поведение, похоже, отличается от использования textFile, есть ли способ добиться загрузки всех файлов в формате csv?

Спасибо,
Натан

1 ответ

Звучит подозрительно, как ошибка.

Это означает: поиск сообщения об ошибке и трассировку стека в Issue.apache.org. FWIW, это может быть SPARK-15473. Если он есть и еще нет, добавьте к нему свой стек; если нет, то добавьте что-то новое.

первое: изолировать его от входа s3; попробуйте скопировать его с помощью file:// URLs. Это поможет обвинить правильную часть кода.

Кроме того, время обхода. Считыватель данных CSV по-прежнему работает

Другие вопросы по тегам