如何以编程方式重命名 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 - GlueContext:从 S3 读取分区数据,将分区添加为 DynamicFrame 的列