gpt4 book ai didi

amazon-web-services - 使用glueContext.write_dynamic_frame.from_options 的AWS Glue 导出到 Parquet 问题

转载 作者:行者123 更新时间:2023-12-01 13:21:10 27 4
gpt4 key购买 nike

我有以下问题。

以下代码由 AWS Glue 自动生成。

它的任务是从 Athena 获取数据(由 .csv @ S3 备份)并将数据转换为 Parquet。

该代码适用于引用航类数据集和一些相对较大的表(~100 Gb)。

但是,在大多数情况下,它返回错误,这并没有告诉我太多。

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkConf, SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

conf = (SparkConf()
.set("spark.driver.maxResultSize", "8g"))

sc = SparkContext(conf=conf)
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "XXX", table_name = "csv_impressions", transformation_ctx = "datasource0")

applymapping1 = ApplyMapping.apply(frame = datasource0, mappings = [("event time", "long", "event_time", "long"), ("user id", "string", "user_id", "string"), ("advertiser id", "long", "advertiser_id", "long"), ("campaign id", "long", "campaign_id", "long")], transformation_ctx = "applymapping1")

resolvechoice2 = ResolveChoice.apply(frame = applymapping1, choice = "make_struct", transformation_ctx = "resolvechoice2")

dropnullfields3 = DropNullFields.apply(frame = resolvechoice2, transformation_ctx = "dropnullfields3")

datasink4 = glueContext.write_dynamic_frame.from_options(frame = dropnullfields3, connection_type = "s3", connection_options = {"path": "s3://xxxx"}, format = "parquet", transformation_ctx = "datasink4")
job.commit()

AWS Glue 识别的错误消息是:

An error occurred while calling o72.pyWriteDynamicFrame



日志文件还包含:

Job aborted due to stage failure: ... Task failed while writing rows



知道如何找出失败的原因吗?

或者它可能是什么?

最佳答案

第 1 部分:识别问题

如何找到导致问题的原因的解决方案是从 .parquet 切换输出至 .csv并放下 ResolveChoiceDropNullFields (因为 Glue 自动为 .parquet 建议):

datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://xxxx"}, format = "csv", transformation_ctx = "datasink2")
job.commit()

它产生了更详细的错误消息:

An error occurred while calling o120.pyWriteDynamicFrame. Job aborted due to stage failure: Task 5 in stage 0.0 failed 4 times, most recent failure: Lost task 5.3 in stage 0.0 (TID 182, ip-172-31-78-99.ec2.internal, executor 15): com.amazonaws.services.glue.util.FatalException: Unable to parse file: xxxx1.csv.gz



文件 xxxx1.csv.gz错误消息中提到的 Glue 似乎太大了(~100Mb .gzip 和 ~350Mb 作为未压缩的 .csv)。

第 2 部分:问题的真正根源和修复

如第一部分所述,感谢导出到 .csv可以识别错误的文件。

通过将 .csv 加载到 R 中的进一步调查显示其中一列包含单个 string记录,而该列的所有其他值都是 longNULL .

在 R 中删除这个值并将数据重新上传到 S3 后,问题就消失了。

注意 #1:该列被声明为 string在雅典娜,所以我认为这种行为是错误

注意#2:问题的本质不是数据的大小。我已经成功处理了高达 200Mb 的文件 .csv.gz大约相当于 600 Mb .csv .

关于amazon-web-services - 使用glueContext.write_dynamic_frame.from_options 的AWS Glue 导出到 Parquet 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49893397/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com