使用AWS re:Post即您表示您同意 AWS re:Post 使用条款

如何解决在查询 Amazon Athena 中的表时出现的“HIVE_METASTORE_ERROR”错误?

2 分钟阅读
0

我在查询我的 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
  1. 要将特殊字符“/”替换为下划线“_”,请运行以下脚本:

    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
  2. 从 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 配额

要解决此错误,请选择以下一个或多个解决方案:

  • 将 Lambda 函数的响应负载作为对象上传到 Amazon S3 桶。然后,将此对象作为负载包含在 Lambda 函数响应中。有关为您的对象生成预签名 URL 的信息,请参阅使用预签名 URL 共享对象
  • 如果您的表已分区,并且您的用例允许,则仅查询特定的分区。
  • 创建 Lambda 函数时,请指定 Amazon S3 中的溢出位置。大于阈值的响应会溢出到指定的 S3 位置中。

"HIVE_METASTORE_ERROR: Failed to fetch partitions from Glue Data Catalog"

出现此错误的原因如下:

  • 分区元数据中存在的列名包含下划线以外的特殊字符。有关详细信息,请参阅表、数据库和列的名称
  • 分区元数据中定义的 StorageDescriptor 中缺少 SerDe 信息。

要确定存在问题的分区,请执行以下操作之一:

要解决分区问题,请运行 DDL 语句 ALTER TABLE DROP PARTITION 来删除分区。然后,请执行以下操作之一:

相关信息

在 Athena 中进行故障排除

AWS 官方
AWS 官方已更新 9 个月前