apache-spark - Spark - 读取和写入相同的 S3 位置

标签 apache-spark amazon-s3 pyspark aws-glue

我正在从 S3 位置读取数据集 dataset1 和 dataset2。然后我转换它们并写回到从中读取 dataset2 的相同位置。

但是,我收到以下错误消息:

An error occurred while calling o118.save. No such file or directory 's3://<myPrefix>/part-00001-a123a120-7d11-581a-b9df-bc53076d57894-c000.snappy.parquet

如果我尝试写入新的 S3 位置,例如s3://dataset_new_path.../ 然后代码工作正常。

my_df \
  .write.mode('overwrite') \
  .format('parquet') \
  .save(s3_target_location)

注意:我在读取数据帧后尝试使用 .cache() 但仍然遇到相同的错误。

最佳答案

这导致问题的原因是您正在读取和写入您试图覆盖的同一路径。这是标准的 Spark 问题,与 AWS Glue 无关。

Spark 在 DF 上使用惰性转换,并在调用特定操作时触发。它创建 DAG 以保存有关应应用于 DF 的所有转换的信息。

当您从同一位置读取数据并使用覆盖写入时,“使用覆盖写入”是 DF 的操作。当 spark 看到 'write using override' 时,它会在它的执行计划中添加先删除路径,然后尝试读取已经空置的路径;因此错误。

可能的解决方法是先写入某个临时位置,然后将其用作源,在 dataset2 位置覆盖

关于apache-spark - Spark - 读取和写入相同的 S3 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58362511/

相关文章:

apache-spark - 使用哪个查询以获得更好的性能,加入 SQL 或使用数据集 API?

apache-spark - 处理 spark streaming 中的数据库连接

apache-spark - 为什么 pyspark 失败并显示 "Error while instantiating ' org.apache.spark.sql.hive.HiveSessionStateBuilder'”?

python - 如何合并 pyspark 和 pandas 数据框

python - apache Spark 输入路径不存在错误

algorithm - Spark : Counting co-occurrence - Algorithm for efficient multi-pass filtering of huge collections

amazon-web-services - S3 存储 JSON 与 DynamoDB

apache-spark - presto 是否需要 Hive Metastore 才能从 S3 读取 Parquet 文件?

linux - 亚马逊aws在数据传输过程中会花费一些费用吗?

sql - 在 spark sql 中用 LIMIT 描述