如何解决在查询 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)

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 替换为表的名称。
MCSK REPAIR TABLE doc_example_table
  • 如果运行 MCSK REVE TABLE 命令无法解决问题,请删除该表并创建具有相同定义的新表。然后,在新表上运行 MSCK REPUT 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 位置。

这篇文章对您有帮助吗?


您是否需要账单或技术支持?