Redshift跨表插入数据:AWS Glue作业与查询工具方案咨询
当然可以用AWS Glue作业完成这个任务,不过也可以直接用Redshift自带的SQL工具(比如Query Editor v2或者SQL Workbench/J)来实现——具体选哪种,完全看你的实际需求场景。下面我给你拆解两种方案的实现方法,还有各自的优缺点:
方案一:直接用Redshift SQL工具实现(快捷首选)
如果只是一次性执行这个插入逻辑,或者数据量不大、逻辑简单,直接写SQL是最省心的,不需要额外配置任何ETL环境。
你可以在Redshift的Query Editor或者SQL Workbench/J里执行这段SQL:
INSERT INTO Selection (perId, "check") SELECT id AS perId, CASE WHEN CONCAT(firstName, lastName) IN ('JohnLuie', 'FranklinWatson') THEN 1 ELSE 0 END AS "check" FROM Person;
注意点:
check是Redshift的关键字,所以需要用双引号包裹才能作为字段名使用- 如果后续Person表会新增数据,需要做增量插入的话,可以加个过滤条件避免重复插入:
INSERT INTO Selection (perId, "check") SELECT id AS perId, CASE WHEN CONCAT(firstName, lastName) IN ('JohnLuie', 'FranklinWatson') THEN 1 ELSE 0 END AS "check" FROM Person WHERE id NOT IN (SELECT perId FROM Selection);
这种方案的优势是快速、低成本,不需要维护额外的ETL资源,适合简单的一次性或低频操作。
方案二:用AWS Glue作业实现(适合自动化/复杂场景)
如果你的需求是要定期自动执行这个任务,或者后续可能要扩展更复杂的ETL逻辑(比如先清洗Person表的数据、合并其他数据源),那用Glue作业就更合适了。下面是用Python Spark实现的步骤:
1. 准备工作(可选)
如果还没在Glue Data Catalog里注册Redshift的两张表,先创建一个Glue Crawler,指向你的Redshift数据库,爬取Person和Selection表的元数据,生成对应的Catalog表。
2. 编写Glue ETL作业代码
创建一个Glue Python作业,用下面的代码实现逻辑:
import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job from pyspark.sql.functions import concat, col, when # 初始化Glue上下文 args = getResolvedOptions(sys.argv, ['JOB_NAME']) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME'], args) # 从Glue Catalog读取Person表数据 person_df = glueContext.create_dynamic_frame.from_catalog( database="your_redshift_db_name", # 替换成你的Redshift数据库在Glue Catalog中的名称 table_name="person" ).toDF() # 定义目标全名列表 target_full_names = ['JohnLuie', 'FranklinWatson'] # 生成要插入Selection表的数据 selection_df = person_df.withColumn( "check", when(concat(col("firstName"), col("lastName")).isin(target_full_names), 1).otherwise(0) ).select(col("id").alias("perId"), col("check")) # 将数据写入Redshift的Selection表 glueContext.write_dynamic_frame.from_catalog( frame=DynamicFrame.fromDF(selection_df, glueContext, "selection_data"), database="your_redshift_db_name", table_name="selection" ) job.commit()
注意点:
- 要给Glue作业的IAM角色配置足够的权限:包括访问Redshift的权限、Glue Data Catalog的权限,以及必要的S3临时存储权限(Glue作业会用S3做临时数据交换)
- 如果需要增量同步,同样可以在读取Person表时添加过滤条件,比如只处理最近新增的数据
- 可以在Glue作业里设置调度规则,比如每天凌晨自动执行,实现完全自动化
这种方案的优势是灵活、可扩展,能和其他AWS服务无缝集成,适合需要长期维护、自动化执行的ETL任务。
总结
- 简单一次性操作:优先选Redshift SQL工具,快捷省事
- 需要自动化/复杂逻辑:选AWS Glue作业,扩展性更强
内容的提问来源于stack exchange,提问作者Dipayan Som




