You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动