Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
當我查詢 Amazon Athena 資料表時,為什麼會得到零筆記錄?
我在 Amazon Athena 執行了 CREATE TABLE 陳述式,其中包含預期的欄位及資料類型。當我執行查詢 SELECT * FROM table-name 時,輸出為「傳回零筆記錄」。
解決方法
查詢可能傳回零筆記錄有幾個常見原因。根據您的使用情況,請參閱相關部分,了解常見原因和疑難排解步驟。
AWS Glue 分割區
編目程式設定中已選取檔案
如果您使用編目程式,請確認編目程式指向 Amazon Simple Storage Service (Amazon S3) 儲存貯體,而非指向檔案。此外,請確定 S3 儲存貯體路徑不包含尾端斜線。例如,使用 s3://doc-example-bucket/new 而不是 s3://doc-example-bucket/new/data.json。
LOCATION 路徑不正確
請驗證輸入資料的 Amazon S3 LOCATION 路徑。如果輸入 LOCATION 路徑不正確,Athena 將傳回零筆記錄。請確定 S3 儲存貯體路徑不包含檔案、尾端斜線或萬用字元。例如,使用 s3://doc-example-bucket/new 而不是 s3://doc-example-bucket/new/data.json。
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 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
特殊字元
最佳實務是在資料表的欄名稱中僅包含底線或大寫字母。例如,您可以命名欄 table_name,但不能命名 table-name。
**注意:**AWS Glue 和 Athena 無法讀取底線以外的駱駝字元、大寫字母或特殊字元。
多個資料表的資料以相同的 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 TABLE 或 ALTER 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 支援的格式儲存,或位於不同的 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 檔案位置不遵循 location pattern .../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'。
相關資訊
相關內容
- 已提問 2 年前lg...
- AWS 官方已更新 4 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 1 年前