當我查詢 Amazon Athena 資料表時,為什麼會得到零筆記錄?

2 分的閱讀內容
0

我在 Amazon Athena 執行了 CREATE TABLE 陳述式,其中包含預期的欄位及資料類型。當我執行查詢 SELECT * FROM table-name 時,輸出為「傳回零筆記錄」。

解決方法

查詢可能傳回零筆記錄有幾個常見原因。根據您的使用情況,請參閱相關部分,了解常見原因和疑難排解步驟。

AWS Glue 分割區

爬蟲程式設定中已選取檔案

如果您使用爬蟲程式,請確認爬蟲程式指向 Amazon Simple Storage Service (Amazon S3) 儲存貯體,而非指向檔案。

LOCATION 路徑不正確

請驗證輸入資料的 Amazon S3 LOCATION 路徑。如果輸入 LOCATION 路徑不正確,Athena 將傳回零筆記錄。

LOCATION 路徑中有雙斜線

Athena 不支援包含雙斜線 (//) 的資料表位置路徑。例如,下列 LOCATION 路徑會傳回空白結果:s3://doc-example-bucket/myprefix//input//

若要解決此問題,請將檔案複製到沒有雙斜線的位置。以下是用於複製檔案的 AWS Command Line Interface (AWS CLI) 命令:

aws s3 cp s3://doc-example-bucket/myprefix//input// s3://doc-example-bucket/myprefix/input/ --recursive

**注意:**如果您在執行 AWS CLI 命令時收到錯誤訊息,請確認您使用的是最新版本的 AWS CLI

特殊字元

最佳實務是在資料表的欄名稱中僅包含底線或大寫字母。例如,您可以命名欄 table_name,但不能命名 table-name多個資料表的資料以相同的 S3 字首儲存 AWS Glue 爬蟲程式會針對以相同 S3 字首儲存的資料建立個別資料表。不過,在 Athena 中查詢這些資料表時,您會得到零筆記錄。例如,如果資料表位置類似於下面的範例,Athena 查詢就會傳回零筆記錄:

  • s3://doc-example-bucket/table1.csv
  • s3://doc-example-bucket/table2.csv

若要解決此問題,請為每個資料表建立個別的 S3 前置詞,如下面的範例所示:

  • s3://doc-example-bucket/table1/table1.csv
  • s3://doc-example-bucket/table2/table2.csv

然後,執行類似下面範例的查詢以更新資料表 table1 的位置:

ALTER TABLE table1 SET LOCATION 's3://doc-example-bucket/table1';

分割區尚未載入

Athena 只會在建立資料表後建立中繼資料。只有在您執行查詢時才會剖析資料。如果您的資料表已定義分割區,這些分割區可能尚未載入 AWS Glue Data Catalog 或內部 Athena 資料型錄中。請使用 MSCK REPAIR TABLEALTER TABLE ADD PARTITION 將分割區資訊載入型錄。

如果分割區是以 Athena 支援的格式儲存,則執行 MSCK REPAIR TABLE 將分割區的中繼資料載入型錄。例如,如果您有一個以年份分割的資料表,則 Athena 預期會在類似下面範例的 Amazon S3 路徑上找到資料:

  • s3://doc-example-bucket/athena/inputdata/year=2020/data.csv
  • s3://doc-example-bucket/athena/inputdata/year=2019/data.csv
  • s3://doc-example-bucket/athena/inputdata/year=2018/data.csv

如果資料位於 Athena 預期的 Amazon S3 路徑上,請執行類似下列範例的命令來修復資料表:

CREATE EXTERNAL TABLE Employee (
    Id INT,
    Name STRING,
    Address STRING
) PARTITIONED BY (year INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3://doc-example-bucket/athena/inputdata/';

建立資料表之後,載入分割區資訊:

MSCK REPAIR TABLE Employee;

載入資料之後,再次執行下列查詢:

SELECT * FROM Employee;

如果分割區不是以 Athena 支援的格式儲存,或位於不同的 Amazon S3 路徑,請為每個分區執行 ALTER TABLE ADD PARTITION。

例如,假設您的資料位於下列範例 Amazon S3 路徑:

  • s3://doc-example-bucket/athena/inputdata/2020/data.csv
  • s3://doc-example-bucket/athena/inputdata/2019/data.csv
  • s3://doc-example-bucket/athena/inputdata/2018/data.csv

使用這些路徑,執行類似下列範例的命令:

ALTER TABLE Employee ADD
    PARTITION (year=2020) LOCATION 's3://doc-example-bucket/athena/inputdata/2020/'
    PARTITION (year=2019) LOCATION 's3://doc-example-bucket/athena/inputdata/2019/'
    PARTITION (year=2018) LOCATION 's3://doc-example-bucket/athena/inputdata/2018/'

載入資料之後,再次執行下列查詢:

SELECT * FROM Employee;

Hive 隱藏檔案

請確認您的檔案名稱不是以底線 (_) 或點 (.) 開頭。

Athena 會將這些檔案視為預留位置,並在您處理查詢時忽略這些檔案。如需詳細資訊,請參閱 Athena 無法讀取隱藏的檔案。如果 S3 路徑中所有檔案名稱皆以底線或點開頭,您就會收到零筆記錄。

**注意:**如果 S3 路徑包含預留位置,還有以不同字元開頭的檔案名稱,則 Athena 只會忽略預留位置並查詢其他檔案。因此,您可能會得到一或多筆記錄。

例如:

  • s3://doc-example-bucket/athena/inputdata/_file1
  • s3://doc-example-bucket/athena/inputdata/.file2

分割區投影

不在分割區投影範圍內的值

查詢超出為資料分割投影所定義的範圍界限的值不會傳回錯誤。相反,查詢會傳回零個資料列。

例如,假設您的資料從 2020 年開始,定義為:projection.timestamp.range'='2020/01/01,NOW

如果您執行此範例查詢,查詢會成功完成,但傳回零個資料列:

SELECT * FROM table-name WHERE timestamp = '2019/02/02'

儲存範本不遵循預設的分割區方案

如果您的 Amazon S3 檔案位置不遵循位置模式".../column=value...",則必須指定自訂 Amazon S3 分割方案。如果未定義自訂方案,則查詢會傳回零筆記錄。

若要定義自訂 S3 分割方案,請參閱指定自訂 S3 儲存位置

自訂儲存範本不正確

如果您使用自訂範本,請確定該範本允許 Athena 建立您的分割區位置。另請確定每個預留位置和 Amazon S3 路徑都以單一正斜線結尾。

例如,假設您使用 DDL 陳述式 PARTITIONED BY (year string) 定義分割區資料欄 year,而 S3 檔案位置為 **s3://doc-example-bucket/athena/inputdata/Year=2022/。**此位置將傳回零筆記錄。將 Amazon S3 儲存位置更新為:s3://doc-example-bucket/athena/inputdata/Year=${year}

分割區屬性

如果您有枚舉、整數或日期類型的分割區資料欄,請確保正確設定分割區屬性。這些組態必須允許 Athena 建立符合 Amazon S3 上資料結構的分割區位置。

例如,假設您有時間相關的資料,這些資料於每天午夜後一小時於下列位置提供:s3://doc-example-bucket/athena/inputdata/2022-01-01-01-00

在此範例中,Athena 資料表使用下列分割區屬性:

'projection.dt.format' = 'yyyy-MM-dd-HH-mm',
'projection.dt.range' = '2022-01-01-00-00,NOW',
'projection.dt.interval' = '1',
'projection.dt.interval.unit' = 'DAYS'

在範例資料表上執行的查詢會傳回零筆記錄。這是因為屬性的投影檔案位置對應於午夜 s3://doc-example-bucket/athena/inputdata/2022-01-01-00-00。

若要解決這個問題,請將屬性 'projection.dt.range' 設定為 '2022-01-01-01-00,NOW'

相關資訊

在 Athena 中建立資料表

使用 AWS Glue 爬蟲程式

設定分割區投影

AWS 官方
AWS 官方已更新 8 個月前