使用AWS CLI更新AWS Glue表列数据类型遇报错,求解决方案
解决AWS CLI更新Glue表字段类型时的参数错误问题
你遇到的问题核心是两个点:
update-table命令的参数冲突:你的tableinputJSON里已经包含了Name字段,再额外指定--name选项会让CLI混淆,触发错误- 直接传递未转义的JSON字符串给
--table-input时,shell会把空格分割成多个选项,导致"未知选项"报错
修正后的脚本(使用jq处理JSON,更通用)
如果你的环境有jq(AWS环境通常默认安装),可以用这个更可靠的版本:
#!/bin/bash databasename="your_db_name" tablename="my_table_name" # 获取表结构并修改id列类型 tableinput=$(aws glue get-table --database-name $databasename --name $tablename | jq '.Table | .StorageDescriptor.Columns[2].Type = "bigint"') # 使用--cli-input-json传递完整JSON,避免shell解析问题 aws glue update-table --cli-input-json "{\"DatabaseName\": \"$databasename\", \"TableInput\": $tableinput}"
如果你坚持用原来的json工具
需要把tableinput用引号包裹,并且移除--name选项:
#!/bin/bash tableinput=$( aws glue get-table \ --database-name $databasename \ --name $tablename \ | json Table \ | json -e "this.StorageDescriptor.Columns[2].Type='bigint'" ) aws glue update-table \ --database-name $databasename \ --table-input "$tableinput"
关键说明
- 移除--name选项:因为
tableinput里已经包含了表名Name字段,update-table会从TableInput中读取该信息,不需要额外指定 - 引号包裹JSON:把
$tableinput放在双引号里,防止shell把JSON中的空格解析成多个命令选项 - 推荐用--cli-input-json:这种方式直接传递结构化JSON,完全避免shell解析字符串的问题,是AWS CLI处理复杂JSON参数的最佳实践
另外,你的tableinput里包含了很多不必要的字段(比如CreateTime、UpdateTime、CreatedBy等),其实update-table只需要必要的字段(Name、StorageDescriptor等),精简后的JSON也能正常更新,出错概率更低。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

