Amazon web services AWS使用glueContext.write\u dynamic\u frame.from\u选项导出到拼花地板问题

Amazon web services AWS使用glueContext.write\u dynamic\u frame.from\u选项导出到拼花地板问题,amazon-web-services,pyspark,etl,aws-glue,Amazon Web Services,Pyspark,Etl,Aws Glue,我有以下问题 下面的代码是由AWS Glue自动生成的 它的任务是从雅典娜收集数据(由.csv@S3备份),并将数据转换成拼花地板 代码用于参考飞行数据集和一些相对较大的表(~100GB) 但是,在大多数情况下,它会返回错误,这不会告诉我太多 import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkConf,

我有以下问题

下面的代码是由AWS Glue自动生成的

它的任务是从雅典娜收集数据(由.csv@S3备份),并将数据转换成拼花地板

代码用于参考飞行数据集和一些相对较大的表(~100GB)

但是,在大多数情况下,它会返回错误,这不会告诉我太多

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识别的错误消息为:

调用o72.pyWriteDynamicFrame时出错

日志文件还包含:

由于阶段失败,作业已中止:。。。 写入行时任务失败

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


或者可能是什么?

第1部分:识别问题

如何找到导致问题的原因的解决方案是将输出从
.parquet
切换到
.csv
,然后删除
ResolveChoice
DropNullFields
(这是由
.parquet
的胶水自动建议的):

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

调用o120.pyWriteDynamicFrame时出错。作业中止 由于阶段失败:阶段0.0中的任务5失败4次,最近一次 失败:在阶段0.0(TID 182, ip-172-31-78-99.ec2.内部,执行者15): com.amazonaws.services.glue.util.FatalException:无法分析文件: xx1.csv.gz

错误消息中提到的文件
xxxx1.csv.gz
对于胶水来说似乎太大(~100Mb
.gzip
和~350Mb作为未压缩的
.csv

第2部分:问题的真正来源和解决方法

如第1部分所述,由于导出到
.csv
,因此可以识别错误的文件

通过将.csv加载到R中进行的进一步调查显示,其中一列包含一个
字符串
记录,而此列的所有其他值都是

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

注释1:在Athena中,该列被声明为“代码>字符串< /代码>,因此我认为此行为为bug


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

请使用数据目录中更新的表架构

我也经历过同样的错误。在我的例子中,爬虫程序在数据库中创建了同一文件的另一个表。我指的是那个旧的。如果爬虫一次又一次地爬行同一路径,并在数据目录中创建不同的模式表,则可能会发生这种情况。所以glue job找不到表名和模式。从而给出了这个错误


此外,您可以将DeleteBehavior:“LOG”更改为DeleteBehavior:“DELETE_IN_DATABASE”

那么您是如何解决它的呢?
datasink2 = glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://xxxx"}, format = "csv", transformation_ctx = "datasink2")
job.commit()