我在同一个存储桶中对存储在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。
答案 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会抛出错误,告诉读取和写入不允许的相同位置。