AWS Glue 数据从 S3 迁移到 Redshift

Posted

技术标签:

【中文标题】AWS Glue 数据从 S3 迁移到 Redshift【英文标题】:AWS Glue Data moving from S3 to Redshift 【发布时间】:2021-11-01 10:35:24 【问题描述】:

我在一个 S3 存储桶中有大约 70 个表,我想使用胶水将它们移动到红移。我只能移动几张桌子。他们中的其他人都有数据类型问题。 Redshift 不接受某些数据类型。我在一组逐个移动表格的代码中解决了这个问题:

table1 = glueContext.create_dynamic_frame.from_catalog(
    database="db1_g", table_name="table1"
)
table1 = table1.resolveChoice(
    specs=[
        ("column1", "cast:char"),
        ("column2", "cast:varchar"),
        ("column3", "cast:varchar"),
    ]
)
table1 = glueContext.write_dynamic_frame.from_jdbc_conf(
    frame=table1,
    catalog_connection="redshift",
    connection_options="dbtable": "schema1.table1", "database": "db1",
    redshift_tmp_dir=args["TempDir"],
    transformation_ctx="table1",
)

相同的脚本用于所有其他有数据类型更改问题的表。 但是,由于我想自动化脚本,我使用循环表脚本遍历所有表并将它们写入红移。我有 2 个与此脚本相关的问题。

    无法将表移动到 redshift 中的相应架构。 无法在循环脚本中为需要更改数据类型的表添加 if 条件。
client = boto3.client("glue", region_name="us-east-1")

databaseName = "db1_g"
Tables = client.get_tables(DatabaseName=databaseName)
tableList = Tables["TableList"]

for table in tableList:
    tableName = table["Name"]
    datasource0 = glueContext.create_dynamic_frame.from_catalog(
        database="db1_g", table_name=tableName, transformation_ctx="datasource0"
    )

    datasink4 = glueContext.write_dynamic_frame.from_jdbc_conf(
        frame=datasource0,
        catalog_connection="redshift",
        connection_options=
            "dbtable": tableName,
            "database": "schema1.db1",
        ,
        redshift_tmp_dir=args["TempDir"],
        transformation_ctx="datasink4",
    )
job.commit()

像这样提到红移模式名称和tableNameschema1.tableName 抛出错误,上面写着schema1 is not defined

任何人都可以在循环脚本本身内帮助更改所有需要相同的表的数据类型吗?

【问题讨论】:

【参考方案1】:

所以第一个问题很容易解决。该架构属于dbtable 属性而不是database,如下所示:

connection_options=
            "dbtable": f"schema1.tableName,
            "database": "db1",

您的第二个问题是您想在 for 循环中调用 resolveChoice,对吗?那里会发生什么样的错误?为什么它不起作用?

【讨论】:

我需要更改许多表的数据类型,并且解决选择需要用于许多表。如何对循环内的许多表使用解析选择?如果我不更改数据类型,则会引发错误。当我不使用循环时,我能够使用解决选择。 每个表都有完全相同的架构吗?如果没有,在 for 循环中执行此操作将不太实际。 我有 3 个模式。所以,我可以创建 3 个循环语句。对吗? 和解析选项可以在循环脚本中使用吗? 是的,应该可以。

以上是关于AWS Glue 数据从 S3 迁移到 Redshift的主要内容,如果未能解决你的问题,请参考以下文章

将 AWS Glue 作业迁移到 EC2

从 AWS Redshift 到 S3 的 AWS Glue ETL 作业失败

从 EMR 迁移到 AWS Glue 后在 Spark SQL 中找不到表

AWS Glue - 从 sql server 表中读取并作为自定义 CSV 文件写入 S3

如何在 AWS 中使用 Glue 作业覆盖 s3 数据

AWS Glue - GlueContext:从 S3 读取分区数据,将分区添加为 DynamicFrame 的列