我已经将存储在S3上两个位置的 parquet 文件分区到同一存储桶中:
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。
3条答案
按热度按时间myzjeezk1#
我没有找到这个问题的直接解决方案,所以我使用了一个变通方案:
yduiuuwa2#
在上述情况下,由于读取和写入路径相同,一致性模型变为最终一致性。给予个例子,在您的代码中,数据从相同的路径1读取,最终数据也是到路径1,它最初读取数据,但当spark开始写入数据时,正在读取的数据被删除,因此会出现
java.io.FileNotFound
异常。因此,如果可能,您应该使用不同的路径写入最终输出。这种读写甚至被认为是spark sql中的错误,当你从一个表中读取一个 Dataframe 并写入同一个表时,spark会抛出一个错误,告诉你不允许读取和写入同一个位置。
idfiyjo83#
建议使用Spark、Yarn、分段方向