0

我正在尝试从 Amazon S3 读取 excel 表,这是代码片段。但是它没有说文件不存在,尽管它在那里,我检查了路径中缺少斜杠(/)。

println(path)
val data = sqlContext.read.
    format("com.crealytics.spark.excel").
    option("location", s3path).
    option("useHeader", "true").
    option("treatEmptyValuesAsNulls", "true").
    option("inferSchema","true").
    option("addColorColumns", "true").
    load(path)

路径正确打印为: s3a://AKIAJDDDDDDACNA:A6voquDDDDDqNOUsONDy@my-test/test.xlsx

但是为什么在 spark 读取时缺少斜线?这是错误消息:

 Name: java.io.FileNotFoundException
    Message: s3a:/AKIAJYDDDDDDNA:A6DDDDDDDDDwqxkRqUQyXqqNOUsONDy@my-test/test.xlsx (No such file or directory)
    StackTrace:   at java.io.FileInputStream.open0(Native Method)
      at java.io.FileInputStream.open(FileInputStream.java:212)
      at java.io.FileInputStream.<init>(FileInputStream.java:152)
      at java.io.FileInputStream.<init>(FileInputStream.java:104)
      at com.crealytics.spark.excel.ExcelRelation.<init>(ExcelRelation.scala:28)
      at com.crealytics.spark.excel.DefaultSource.createRelation(DefaultSource.scala:31)
      at com.crealytics.spark.excel.DefaultSource.createRelation(DefaultSource.scala:7)
      at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:345)
      at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:149)
      at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:122)
      at $anonfun$1.apply(<console>:46)
      at $anonfun$1.apply(<console>:46)
      at time(<console>:36)
4

2 回答 2

0

不知何故,s3a URL 正在下降到java.io.FileInputStream.open(),它仅适用于本地文件系统文件,而不适用于 HDFS、S3 等。您需要跟踪其中发生的情况com.crealytics.spark.excel。欢迎使用 IDE 来计算第三方库的工作:)(IntelliJ IDEA 非常擅长那个 BTW,因为它可以从粘贴的堆栈跟踪到特定的源代码)

另外:不要将您的秘密放在您的 URL 中,这很危险,并且出于安全原因,将来可能会被禁用。设置spark.hadoop.fs.s3a.access.keyspark.hadoop.fs.s3a.secret.key在你的spark-defaults.conf.

于 2017-06-08T13:02:52.903 回答
0

或者,您可以使用 HadoopOffice 库来读取/写入 Excel 文件。它支持 Spark 数据源,但也是 Hadoop 原生的,因此您的 s3 URL 可能开箱即用。

https://github.com/ZuInnoTe/hadoopoffice/wiki

于 2017-09-03T21:16:52.163 回答