You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Glue作业Redshift增量同步S3时transformation_ctx元数据未存储问题

Glue作业Redshift源增量同步(作业书签)失效问题原因及修复方案
  • 首先检查Glue作业的作业书签开关是否启用:
    你需要在Glue控制台的作业配置页,将「作业书签」选项设置为启用,仅代码中添加job.init()和job.commit()无法生效,必须同时开启控制台配置。
  • 作业书签键与实际增量列名不匹配:
    你提到Redshift表中的时间戳增量列是date_col,但代码中配置的jobBookmarkKeys为["timestamp"],二者完全不匹配,Glue无法识别正确的增量判断列。需要将该配置改为和实际列名完全一致,同时注意列名大小写必须和Redshift表中的定义完全匹配。
  • transformation_ctx值不固定:
    你代码中transformation_ctx使用变量table_name赋值,需要确保该变量值在每次作业运行时保持固定,Glue以该值作为唯一标识存储书签元数据,值发生变化时会判定为新的数据源,默认拉取全量数据。
  • 作业书签参数配置位置错误:
    Redshift数据源的作业书签相关参数需直接放在connection_options中,而非additional_options内,同时需额外添加"jobBookmarkEnabled": "true"参数明确启用书签。
  • Glue版本兼容性问题:
    Glue 2.0及更早版本对Redshift JDBC源的作业书签支持存在缺陷,建议将作业运行环境升级到Glue 3.0及以上版本。
  • 临时目录权限不足:
    Glue作业关联的IAM角色需要拥有你配置的s3://madl-temp/redshift_temp/路径的s3:PutObject、s3:GetObject、s3:ListBucket权限,权限不足时书签元数据无法写入S3,导致每次运行都拉取全量。
  • 运行次数或书签重置问题:
    作业首次运行时默认拉取全量数据,第二次及后续运行才会返回增量数据;如果之前手动重置过作业书签,下一次运行也会重新拉取全量。

修正后的参考代码

import sys
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
import logging

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

log = logging.getLogger(__name__)
log.setLevel(logging.INFO)

my_conn_options = {
            "url": "你的Redshift连接URL",
            "dbtable": "你的表名",
            "user": "用户名",
            "password": "密码",
            "redshiftTmpDir": "s3://madl-temp/redshift_temp/",
            # 书签相关参数放在connection_options中
            "jobBookmarkEnabled": "true",
            "jobBookmarkKeys": ["date_col"],
            "jobBookmarkKeysSortOrder": "asc"
        }
        
data = glueContext.create_dynamic_frame_from_options(
    connection_type="redshift",
    connection_options=my_conn_options,
    # 确保该值固定不变
    transformation_ctx="redshift_your_table_name_sync_ctx"
).toDF()

log.info(str(data.count()))

# 你的数据处理、写入S3逻辑

job.commit()

内容的提问来源于stack exchange,提问作者whatsinthename

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:45:03