我在查询我的 Amazon Athena 表时收到“HIVE_METASTORE_ERROR”错误。
解决方法
请参阅以下“HIVE_METASTORE_ERROR”错误类型,了解原因和解决方法。
**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请参阅 Troubleshoot AWS CLI errors。此外,确保您使用的是最新版本的 AWS CLI。
"HIVE_METASTORE_ERROR: com.facebook.presto.spi.PrestoException: Error: : expected at the position 1234 of struct<test_column> but '/' is found.(Service: null; Status Code: 0; Error Code: null; Request ID: null)"
-或-
"HIVE_METASTORE_ERROR: com.amazonaws.services.datacatalog.model.InvalidInputException: Error: : expected at the position 11884 of ... but '#' is found"
所查询表中的列名包含特殊字符,或者分区架构中的列名包含特殊字符。Athena 不支持下划线以外的特殊字符。有关详细信息,请参阅表、数据库和列的名称。
要解决此错误,必须将列名称中的特殊字符替换为下划线。然后,编辑表的现有架构。
以下示例 AWS Glue 表包含一个名为“a.txt”且带有特殊字符“/”的数据文件:
col/1,col_2,col/3
data1,data2,data3
data4,data5,data6
-
要将特殊字符“/”替换为下划线“_”,请运行以下脚本:
string = open('a.txt').readlines()
string[0] = string[0].replace('/', '_')
open('b.txt', 'w').write(string)
使用新数据文件“b.txt”的输出示例:
col_1,col_2,col_3
data1,data2,data3
data4,data5,data6
-
从 AWS Glue 控制台编辑表的现有架构,然后将“/”替换为 Athena 支持的任何其他字符。
"HIVE_METASTORE_ERROR: com.facebook.presto.spi.PrestoException: Required Table Storage Descriptor is not populated"
-或-
"HIVE_METASTORE_ERROR: Table is missing storage descriptor"
StorageDescriptor 参数包含有关表物理存储的信息。如果表中的一个或多个分区由于分区损坏而未设置分区位置,您会收到此错误。
要解决此错误,请选择以下一个或多个解决方案:
-
如果您的表已经分区,并且数据是以 Amazon Simple Storage Service(Amazon S3)Hive 分区格式加载的,则加载这些分区。运行与以下示例类似的命令:
**注意:**确保将 doc_example_table 替换为您的表名称。
MSCK REPAIR TABLE doc_example_table
-
如果 MSCK REPAIR TABLE 命令未解决问题,则删除该表并创建一个具有相同定义的新表。然后,在新表上运行 MSCK REPAIR TABLE 命令。
-
在 Amazon S3 存储桶中创建一个单独的文件夹,然后将要查询的数据文件移至该文件夹中。创建一个指向该文件夹而不是存储桶的 AWS Glue 爬网程序。
"HIVE_METASTORE_ERROR: com.facebook.presto.spi.PrestoException: java.io.IOException: Response payload size (11112222 bytes) exceeded maximum allowed payload size (6291556 bytes)"
您使用 AWS Lambda 函数对跨账户 AWS Glue Data Catalog 或外部 Hive 元存储运行 Athena 查询。但是,Lambda 的调用负载限制为 6 MB。当从 Lambda 返回的对象的大小超过 6 MB 时,您会收到此错误。Lambda 负载限制是硬性限制,无法提高。有关详细信息,请参阅 Lambda 配额。
要解决此错误,请选择以下一个或多个解决方案:
"HIVE_METASTORE_ERROR: Failed to fetch partitions from Glue Data Catalog"
出现此错误的原因如下:
- 分区元数据中存在的列名包含下划线以外的特殊字符。有关详细信息,请参阅表、数据库和列的名称。
- 分区元数据中定义的 StorageDescriptor 中缺少 SerDe 信息。
要确定存在问题的分区,请执行以下操作之一:
要解决分区问题,请运行 DDL 语句 ALTER TABLE DROP PARTITION 来删除分区。然后,请执行以下操作之一:
相关信息
在 Athena 中进行故障排除