我正在 Glue Crawler 生成的 CSV 数据表上运行 Glue ETL 作业。Crawler 访问具有以下结构的目录
s3
-> aggregated output
->datafile1.csv
->datafile2.csv
->datafile3.csv
Run Code Online (Sandbox Code Playgroud)
这些文件被聚合到一个“聚合输出”表中,可以在 athena 中成功查询。
我正在尝试使用 AWS Glue ETL 作业将其转换为镶木地板文件。工作失败
"py4j.protocol.Py4JJavaError: An error occurred while calling
o92.pyWriteDynamicFrame.
: java.io.IOException: Failed to delete key: parquet-output/_temporary"
Run Code Online (Sandbox Code Playgroud)
我无法在这里找到根本原因
我尝试通过多种方式修改 Glue 作业。我确保分配给作业的 IAM 角色有权删除相关存储桶上的文件夹。现在我正在使用 AWS 提供的默认临时/脚本文件夹。我试过在我的 s3 存储桶上使用文件夹,但看到类似的错误
s3://aws-glue-temporary-256967298135-us-east-2/admin
s3://aws-glue-scripts-256967298135-us-east-2/admin/rt-5/13-ETL-Tosat
Run Code Online (Sandbox Code Playgroud)
在下面分享完整的堆栈跟踪
19/05/10 17:57:59 INFO client.RMProxy: Connecting to ResourceManager at ip-172-32-29-36.us-east-2.compute.internal/172.32.29.36:8032
Container: container_1557510304861_0001_01_000002 on ip-172-32-1-101.us-east-2.compute.internal_8041
LogType:stdout
Log Upload Time:Fri May 10 17:57:53 +0000 2019
LogLength:0
Log Contents:
End of LogType:stdout …Run Code Online (Sandbox Code Playgroud) 我有一个 Glue ETL 脚本,它采用分区的 Athena 表并将其输出到 CSV。该表按两个条件进行分区,即单元和站点。当 Glue 作业运行时,它会为单元和站点分区的每个组合创建一个不同的 CSV 文件。相反,我只想要一个包含所有分区的输出文件,类似于 athena 表的结构
我对 "datasource0.toDF().repartition(1)" 有点玩弄,但我不确定它如何与 AWS 提供的脚本交互。我已经用镶木地板完成了这个,但这个脚本的结构不同
请注意下面的脚本我已经删除了大部分标签映射
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
## @type: DataSource
## @args: [database = "testdata-2018-2019", table_name = "testdata", transformation_ctx = "datasource0"]
## @return: datasource0
## @inputs: [] …Run Code Online (Sandbox Code Playgroud)