您是否尝试过设置transformationContext
源和接收器的值是否相同?它们当前在上次更新中设置为不同的值。
transformationContext = "transformationContext1"
and
transformationContext = "transformationContext2"
我在使用胶水和书签时也遇到过这个问题。我正在尝试执行类似的任务,其中读取按年、月和日分区的分区 JSON 文件,每天都会有新文件到达。我的工作运行一个转换来提取数据的子集,然后放入 S3 上的分区 Parquet 文件中。
我使用的是 Python,因此 DynamicFrame 的初始实例化如下所示:
dyf = glue_context.create_dynamic_frame.from_catalog(database="dev-db", table_name="raw", transformation_ctx="raw")
最后像这样接收到 S3:
glue_context.write_dynamic_frame.from_options(
frame=select_out,
connection_type='s3',
connection_options={'path': output_dir, 'partitionKeys': ['year', 'month', 'day']},
format='parquet',
transformation_ctx="dev-transactions"
)
最初,我运行了该作业,并在启用书签的情况下正确生成了 Parquet。然后我添加了新一天的数据,更新了输入表上的分区并重新运行。第二个作业将失败并出现如下错误:
pyspark.sql.utils.AnalysisException: u"cannot resolve 'year' given input columns: [];;\n'Project ['year, 'month, 'day, 'data']
改变transformation_ctx
是相同的(dev-transactions
在我的例子中)使该过程能够正常工作,仅处理增量分区并为新分区生成 Parquet。
关于一般书签以及如何使用转换上下文变量的文档非常稀疏。
Python 文档只是说:(https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-glue-context.html https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-glue-context.html):
conversion_ctx – 要使用的转换上下文(可选)。
Scala 文档说(https://docs.aws.amazon.com/glue/latest/dg/glue-etl-scala-apis-glue-gluecontext.html https://docs.aws.amazon.com/glue/latest/dg/glue-etl-scala-apis-glue-gluecontext.html):
conversionContext — 与作业书签使用的接收器关联的转换上下文。默认设置为空。
由于文档解释得不好,我所能观察到的最好情况是,转换上下文用于在已处理的源数据和接收器数据之间形成链接,并且定义不同的上下文会阻止书签按预期工作。