Загрузка вложенных 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)
Я пытался использовать следующие пути:
- S3A://bucketname/level1/**
- S3A: // bucketname / level1 /
- 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 по-прежнему работает