如何在AWS Glue作业中从DynamoDB导入仅近10天的部分记录
解决Glue爬虫全表扫描DynamoDB的成本问题
我们的目标是让Glue作业仅爬取过去10天的数据,替代当前的全表扫描,降低DynamoDB读取成本。以下是三种可行方案:
方案一:配置Glue爬虫增量爬取(推荐)
这是最直接降低成本的方式,让爬虫只处理符合时间条件的增量数据:
- 先确认DynamoDB表中有时间戳类型的字段(比如
created_at或updated_at),用来标记数据的创建/更新时间 - 打开AWS Glue控制台,找到对应的爬虫,进入编辑页面
- 在「爬取策略」中选择「增量爬取」,指定刚才的时间戳字段作为增量判断依据,设置起始时间为「过去10天」(也可以配置成动态计算,每天运行时自动取当前日期减10天)
- 保存设置后重新运行爬虫,后续每日作业只会爬取时间戳在过去10天内的新数据或更新数据
方案二:在Glue作业代码中过滤数据
如果暂时无法修改爬虫配置,可以在代码层直接过滤数据,但注意这种方式爬虫仍会全表扫描,成本优化有限:
from pyspark.sql.functions import current_date, date_sub from awsglue.dynamicframe import DynamicFrame # 从Glue Catalog获取原始动态帧 datasource0 = glueContext.create_dynamic_frame.from_catalog(database = "dbname", table_name = "dynamodb_audit", transformation_ctx = "datasource0") # 转换为Spark DataFrame进行过滤操作 raw_df = datasource0.toDF() # 过滤出过去10天的数据(假设时间戳字段为updated_at,类型为date/timestamp) filtered_df = raw_df.filter(raw_df.updated_at >= date_sub(current_date(), 10)) # 转换回Glue DynamicFrame继续后续处理 filtered_dynamic_frame = DynamicFrame.fromDF(filtered_df, glueContext, "filtered_dynamic_frame")
方案三:直接从DynamoDB增量读取(跳过爬虫)
如果不想依赖Glue爬虫,可直接通过Glue连接DynamoDB并指定扫描条件,彻底避免全表扫描:
from pyspark.sql.functions import date_sub, current_date # 计算10天前的日期格式(根据DynamoDB时间戳字段类型调整) ten_days_ago = date_sub(current_date(), 10).strftime("%Y-%m-%d") # 直接从DynamoDB读取符合条件的数据 datasource0 = glueContext.create_dynamic_frame.from_options( connection_type="dynamodb", connection_options={ "dynamodb.input.tableName": "dynamodb_audit", "dynamodb.splits": "10", # 可根据表的规模调整分片数,提升读取效率 "dynamodb.filter.expression": "updated_at >= :start_date", "dynamodb.filter.expression.values": f":start_date={ten_days_ago}" }, transformation_ctx="datasource0" )
内容的提问来源于stack exchange,提问作者Tushar Wasson
相关产品推荐
相关产品推荐

