AWS Glue配置DynamoDB作业书签触发Py4JJavaError如何解决?
报错触发原因
- 从报错栈的
ClassCastException: scala.collection.immutable.$colon$colon cannot be cast to java.lang.String可以定位根因:Glue的DynamoDB连接实现逻辑中,处理additional_options的所有配置项时,默认会将所有值强制转换为字符串类型。你传入的jobBookmarkKeys是数组格式["timestamp"],Scala列表类型无法直接转换为Java字符串,因此抛出类型转换异常。 - 其次,目前Glue原生的自定义作业书签键(
jobBookmarkKeys)配置仅支持JDBC、S3等数据源,暂不支持DynamoDB数据源使用自定义字段作为书签键,你使用的配置方式本身和DynamoDB数据源不兼容。
对应解决方法
方案1:使用DynamoDB原生支持的作业书签(推荐)
DynamoDB数据源的Glue作业书签默认基于DynamoDB Streams实现,不需要额外配置additional_options的书签参数,满足以下条件即可正常启用:
- 开启目标DynamoDB表的流功能
- Glue作业的书签开关设置为「启用」
- 代码中保留
transformation_ctx参数配置(你当前代码已经配置正确)
只需移除additional_options中的书签相关配置,作业即可正常运行,同时书签会自动基于DynamoDB流识别新增、变更的数据。
方案2:自定义实现增量逻辑(适合未开DynamoDB流的场景)
如果你的DynamoDB表没有开启流,可自行实现增量逻辑代替原生作业书签,示例代码如下:
import boto3 # 读取上次作业处理的最大时间戳,示例存在S3元数据桶中,也可存在DynamoDB等存储 s3_client = boto3.client('s3') last_process_ts = int(s3_client.get_object( Bucket="你的元数据存储桶名", Key="glue_job_last_timestamp.txt" )['Body'].read().decode()) # 移除additional_options中的书签配置,正常读取DynamoDB数据 DataSource0 = glueContext.create_dynamic_frame.from_catalog( database = "db", table_name = "table", transformation_ctx = "DataSource0" ) # 过滤出增量数据 incremental_df = DataSource0.filter(f"timestamp > {last_process_ts}") # 此处写你的增量数据处理逻辑 # ... # 作业处理完成后,更新本次处理的最大时间戳,供下次运行使用 current_max_ts = incremental_df.select_fields("timestamp").toDF().agg({"timestamp": "max"}).collect()[0][0] s3_client.put_object( Bucket="你的元数据存储桶名", Key="glue_job_last_timestamp.txt", Body=str(current_max_ts) )
内容的提问来源于stack exchange,提问作者MLaunch
相关产品推荐
相关产品推荐

