我在 s3 中有数百个压缩的 csv 文件,我正在尝试加载它们。目录结构类似于以下内容:
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/**
这可以很好地加载所有子路径下的所有文件。我现在正在尝试在 spark 2 中使用 csv 加载机制,但我不断收到以下错误:
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 格式文件的加载?
谢谢,
内森