如何解决在查询 Amazon Athena 中的表时的“HIVE_METASTORE_ERROR”错误?
上次更新时间:2021 年 5 月 11 日
在查询我的 Amazon Athena 表时,我收到了错误“HIVE_METASTORE_ERROR”。
简短描述
不同类型的“HIVE_METASTORE_ERROR”错误及其原因如下:
- HIVE_METASTORE_ERROR: com.facebook.presto.spi.PrestoException: Error: : expected at the position 1234 of struct
but '/' is found.(Service: null; Status Code: 0; Error Code: null; Request ID: null): (错误:struct 位置 1234 应为“:”,但实际为“/”。(服务:空;状态代码:0;错误代码:空;请求 ID:空))如果查询表中的列名称包含特殊字符,或者分区架构中的列名称包含特殊字符,则会出现此错误。Athena 不支持除下划线以外的特殊字符。有关更多信息,请参阅表、数据库和列名称。 - HIVE_METASTORE_ERROR: com.facebook.presto.spi.PrestoException: Required Table Storage Descriptor is not populated:(未填充需要的表存储描述符)
StorageDescriptor 参数包含有关表物理存储的信息。如果表中的一个或多个分区由于分区损坏而没有分区位置,则会出现此错误。 - HIVE_METASTORE_ERROR: com.facebook.presto.spi.PrestoException: java.io.IOException: Response payload size (11112222 bytes) exceeded maximum allowed payload size (6291556 bytes)(响应负载大小(11112222 字节)超过允许的最大负载大小(6291556 字节)):当您使用 AWS Lambda 函数对跨账户 AWS Glue 数据目录或外部 Hive 元存储运行 Athena 查询时会出现此错误。Lambda 的调用负载限制为 6MB。如果 Lambda 返回的对象大小超过 6MB,则会出现此错误。Lambda 负载限制是一个硬限制,无法上调。有关更多信息,请参阅 Lambda 配额。
解决方法
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)(错误:struct<test_column> 位置 1234 应为“:”,但实际为“/”。(服务:空;状态代码:0;错误代码:空;请求 ID:空))
要解决此错误,请执行以下操作:
- 对数据运行以下自定义脚本,将列名称中的特殊字符替换为下划线:
import re
string = open('a.txt').read()
new_str = re.sub('/', '_', string)
open('b.txt', 'w').write(new_str)
- 从 AWS Glue 控制台编辑表的现有架构,然后用 Athena 支持的任何其他字符替换“/”。
HIVE_METASTORE_ERROR: com.facebook.presto.spi.PrestoException: Required Table Storage Descriptor is not populated(未填充需要的表存储描述符)
要解决此错误,请选择以下一种或多种解决方案:
- 如果您的表已经分区,并且数据以 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)(响应负载大小(11112222 字节)超过允许的最大负载大小(6291556 字节))
要解决此错误,请选择以下一种或多种解决方案:
- 将 Lambda 函数的响应负载作为对象上传到一个 Amazon S3 存储桶中。然后,将此对象作为负载包含在 Lambda 函数响应中。有关为对象生成预签名 URL 的信息,请参阅使用预签名 URL 共享对象。
- 如果表已分区,并且您的使用案例允许,请仅查询该特定的分区。
- 创建 Lambda 函数时,指定 Amazon S3 中的溢出位置。大于阈值的响应会溢出到指定的 S3 位置。