AWS Glue - getSink() 在glue_context.purge_s3_path 之后立即抛出“没有这样的文件或目录”

Posted

技术标签:

【中文标题】AWS Glue - getSink() 在glue_context.purge_s3_path 之后立即抛出“没有这样的文件或目录”【英文标题】:AWS Glue - getSink() is throwing "No such file or directory" right after glue_context.purge_s3_path 【发布时间】:2021-05-07 18:45:31 【问题描述】:

我正在尝试清除粘合目录表的分区,然后使用 getSink 选项重新创建分区(类似于数据库中的截断/加载分区) 为了清除分区,我使用了带有保留期 = 0 的glueContext.purge_s3_path 选项。分区已成功清除。

            self._s3_path=s3://server1/main/transform/Account/local_segment/source_system=SAP/
            self._glue_context.purge_s3_path(
            self._s3_path,
              "retentionPeriod": 0, "excludeStorageClasses": ()
                )

这里 Catalog 数据库 = Account , Table = local_segment , Partition_key = source_system

但是,当我尝试在清除步骤之后立即重新创建分区时,我从 getSink writeFrame 收到“调用 o180.pyWriteDynamicFrame 时发生错误。没有这样的文件或目录”。 如果我删除了清除部分,那么 getSink 工作正常并且能够创建分区并写入文件。

我什至在 purge 和 getSink 之间尝试了“MSCK REPAIR TABLE”,但没有成功。

getSink 是否不应该在不存在的情况下创建分区,即从上一步清除?

       target = self._glue_context.getSink(
            connection_type="s3",
            path=self._s3_path_prefix,
            enableUpdateCatalog=True,
            updateBehavior="UPDATE_IN_DATABASE",
            partitionKeys=["source_system"]
        )
        target.setFormat("glueparquet")
        target.setCatalogInfo(
            catalogDatabase=f"self._target_database",
            catalogTableName=f"self._target_table_name"
        )
        target.writeFrame(self._dyn_frame)
        
        Where - 
        self._s3_path_prefix = s3://server1/main/transform/Account/local_segment/
        self._target_database = Account
        self._target_table_name = local_segment

错误信息:

调用 o180.pyWriteDynamicFrame 时出错。没有这样的文件或目录 's3://server1/main/transform/Account/local_segment/source_system=SAP/run-1620405230597-part-block-0-0-r-00000-snappy.parquet'

【问题讨论】:

【参考方案1】:

尝试检查您是否在 s3 上拥有此对象的权限。我遇到了同样的错误,一旦我将对象配置为公开的(仅用于测试),它就起作用了。所以也许它是一个新对象,你的进程可能没有访问权限。

【讨论】:

以上是关于AWS Glue - getSink() 在glue_context.purge_s3_path 之后立即抛出“没有这样的文件或目录”的主要内容,如果未能解决你的问题,请参考以下文章

AWS Glue ETL 作业中的 Boto3 Glue

aws glue / pyspark - 如何使用 Glue 以编程方式创建 Athena 表

针对 AWS EMR 的 AWS Glue 定价

如何在 AWS-Glue 脚本中编写用户定义的函数?

AWS EMR 与 Glue 目录,明确指定 catalogId

通过 AWS Glue 执行 Redshift 过程