AWS Glue调用get_column_statistics_for_table报EntityNotFoundException错误
问题描述
调用AWS Glue的get_column_statistics_for_table()方法,从S3存储位置关联的表中拉取列元数据统计值时返回EntityNotFoundException错误,已知前置情况:
- 可正常调用
create_crawler()、start_crawler()等其他Glue接口,客户端基础配置、账号权限无异常 - 接口要求的数据库名、表名、列名3个必填参数均直接复制自AWS控制台,参数值完全准确
- 检索技术站点未找到同类问题,核心疑问:调用该接口是否需要提前创建Glue到S3的连接?
复现代码
import boto3 client = boto3.client('glue', region_name="us-east-1") response = client.get_column_statistics_for_table( DatabaseName='Name_of_Database', TableName='Name_of_my_table', ColumnNames=[ 'Column_name_1' ] ) print(response)
接口返回结果
{ 'ColumnStatisticsList': [], 'Errors': [ { 'ColumnName': 'Column_name_1', 'Error': { 'ErrorCode': 'EntityNotFoundException', 'ErrorMessage': 'Statistics do not exist for this column' } } ], 'ResponseMetadata': { 'RequestId': 'Some_alphanumeric no', 'HTTPStatusCode': 200, 'HTTPHeaders': 'common HTTP Headers' }, 'RetryAttempts': 0 }
解答
不需要提前创建Glue到S3的连接,该报错和网络连通性、连接配置完全无关。
从返回的错误信息Statistics do not exist for this column可以明确,报错原因是目标列从未生成过列统计信息,并非接口找不到对应的库、表、列资源,也不是无法访问S3上的源数据。
列统计信息不会随Crawler爬取元数据自动生成,Crawler默认只会同步表结构、分区基础信息,不会主动计算列的最大值、最小值、空值率、基数这类统计值。要正常获取列统计,需要先主动触发统计计算任务:
- 调用
start_column_statistics_task_run接口提交列统计计算任务,需要传入有S3源路径读取权限、Glue操作权限的服务角色ARN,示例代码:
stat_task_resp = client.start_column_statistics_task_run( DatabaseName='Name_of_Database', TableName='Name_of_my_table', ColumnNames=['Column_name_1'], Role='arn:aws:iam::你的账号ID:role/你的Glue服务角色名' )
- 等待任务运行完成(可以通过
get_column_statistics_task_run接口查询任务状态)后,再调用get_column_statistics_for_table()接口即可正常获取对应列的统计数据。
如果你的表是分区表,提交统计任务时可以按需传入PartitionPredicate参数筛选需要统计的分区范围,避免全量扫描S3数据产生不必要的资源消耗。
内容的提问来源于stack exchange,提问作者learner1205
相关产品推荐
相关产品推荐

