如何以编程方式重命名 AWS Glue 目录中的列名

Posted

技术标签:

【中文标题】如何以编程方式重命名 AWS Glue 目录中的列名【英文标题】:How to programmatically rename column names in AWS Glue Catalog 【发布时间】:2018-08-01 11:00:31 【问题描述】:

我已经使用爬虫为 25 个表填充了 Glue 目录。现在表名都有通用的列名。有没有更好的方法来以编程方式重命名列而不是一一手动进行?我也不想用不同的列名再次写入相同的数据。我遇到了 RenameField 类,但不确定它是只是重命名目录还是重新写入整个数据?

【问题讨论】:

【参考方案1】:

1.

您可以使用 boto3 sdk 创建表而不是运行爬虫。 http://boto3.readthedocs.io/en/latest/reference/services/glue.html#Glue.Client.create_table 胶水.create_table(数据库名称=,表输入=) TableInput 参数采用 json 格式,您可以在其中定义表列名称。

“列”:[ '名称':'字符串', '类型':'字符串', '评论':'字符串' , ],

您可以构建“列”元素,编写 Python 代码来读取源表(s3 文件或 mysql 表或您的源定义) 一旦你有了 json,你就可以编写一个 python 脚本来执行 create_table。

2。如果您已经使用爬虫创建了表定义,另一种方法是获取表的定义。

a) 重命名列。 b) 做#1。 c) 删除表。

response = client.delete_table(
CatalogId='string',
DatabaseName='string',
Name='string'
                            )

d) 创建表

3。您可以在 Glue 代码中执行此操作,而无需更改表定义。

重命名列

for c in cust_addressDF.columns:
        cust_addressDF = cust_addressDF.withColumnRenamed(c , "cust_"+c)

这里的 cust_addressDF 是从 Glue DynamicFrame 创建的 spark DataFrame。这将在运行时附加带有“cust_”的列。

我在我的过程中做 #1 和 #3。

【讨论】:

【参考方案2】:

如果您正在运行 Glue ETL 作业,可以使用 ApplyMapping class 重命名列:

# Glue ETL script for python
applymapping1 = ApplyMapping.apply(
frame = datasource0, 
mappings = [
    ("column_1", "string", "column_1", "string"),
    ("column_2", "string", "column_2", "string"),
    ("partition_0", "string", "year", "string"), 
    ("partition_1", "string", "month", "string"), 
    ("partition_2", "string", "day", "string"), 
    ("partition_3", "string", "hour", "string")
    ], 
    transformation_ctx = "applymapping1")

在上面的示例中,分区 0-3 被重命名为年、月、日。

【讨论】:

以上是关于如何以编程方式重命名 AWS Glue 目录中的列名的主要内容,如果未能解决你的问题,请参考以下文章

AWS Glue输出文件名

使用 C# 动态重命名 MS Access 中的列

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

以编程方式重命名 Access 查询中的表

通过 AWS Glue Crawler 识别并存储在数据目录中的表的异常

如何以编程方式重命名 Android 应用程序?