如何解決在 Amazon Athena 中查詢資料表時出現的 "HIVE_METASTORE_ERROR" 錯誤訊息?

2 分的閱讀內容
0

我查詢 Amazon Athena 資料表時收到錯誤 "HIVE_METASTORE_ERROR"。

解決方法

請參閱下列類型的 "HIVE_METASTORE_ERROR" 錯誤訊息,了解其原因和解決方法:

**注意:**如果您在執行 AWS Command Line Interface (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 不支援底線以外的特殊字元。如需詳細資訊,請參閱 Names for tables, databases, and columns

若要解決此錯誤,您必須將資料欄名稱中的特殊字元取代為底線。然後,編輯資料表的現有結構描述。

下列 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 quotas

若要解決此錯誤,請選擇下列一或多個解決方法:

  • 將 Lambda 函數的回應承載作為物件上傳至 Amazon S3 儲存貯體。然後,將此物件作為承載納入 Lambda 函數回應中。關於為物件產生預先簽章 URL 的相關資訊,請參閱 Sharing objects with presigned URLs
  • 如果您的資料表已分割,且您的使用案例允許,請僅查詢特定的分割區。
  • 建立 Lambda 函數時,請指定 Amazon S3 中的溢出位置。大於閾值的回應會溢出到指定的 S3 位置。

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

此錯誤是由下列其中一個原因造成:

  • 分割區中繼資料內的資料欄名稱包含底線以外的特殊字元。如需詳細資訊,請參閱 Names for tables, databases, and columns
  • 分割區中繼資料內定義的 StorageDescriptor 缺少 SerDe 資訊。

若要找出有問題的分割區,請執行下列其中一個操作:

若要解決分割區問題,請執行 DDL 陳述式 ALTER TABLE DROP PARTITION 以移除此分割區。然後,執行下列其中一個操作:

相關資訊

Athena 疑難排解

AWS 官方已更新 1 年前