在S3上覆盖数据帧时,Spark会抛出FileNotFoundException

时间:2016-05-16 13:07:35

标签: java amazon-s3 apache-spark

我在同一个存储桶中对存储在S3上两个位置的镶木地板文件进行了分区:

path1: s3n://bucket/a/
path2: s3n://bucket/b/

数据具有相同的结构。我想从第一个位置读取文件,并使用spark sql将它们聚合到第二个位置。以下是代码段:

val df1 = sql.read.parquet(path1)
val df2 = sql.read.parquet(path2)

val df = df1.unionAll(df2)

df.write.mode(SaveMode.Overwrite).parquet(path1)

当我运行这段代码时,我得到以下异常:

java.io.FileNotFoundException: No such file or directory 
s3n://a/part-r-00001-file.gz.parquet

我正在使用spark 1.6.1和scala 2.11。

2 个答案:

答案 0 :(得分:3)

我没有找到这个问题的直接解决方案所以我使用了一种解决方法:

val df2 = sql.read.parquet(path2)
df2.write.mode(SaveMode.Append).parquet(path1)

val df1 = sql.read.parquet(path1)
df1.write.mode(SaveMode.Overwrite).parquet(path1)

答案 1 :(得分:1)

在上述情况下,由于读取和写入路径相同,因此一致性模型变为最终一致性。 为了给你的代码数据提供一个例子,从同一个路径1读取数据,最后的数据也是路径1,它最初读取数据但是当火花开始写入数据时,被读取的数据被删除,因此给出了java.io.FileNotFound异常。 因此,如果可能,您应该使用不同的路径来编写最终输出。

这种读写如果甚至被认为是spark sql中的错误,当你从表中读取一个数据帧并写入同一个表时,spark会抛出错误,告诉读取和写入不允许的相同位置。