Ongoing service disruptions
For the most recent update on ongoing service disruptions affecting the AWS Middle East (UAE) Region (ME-CENTRAL-1), refer to the AWS Health Dashboard. For information on AWS Service migration, see How do I migrate my services to another region?
當我查詢 Athena 資料表時,為什麼會得到零筆記錄?
我在 Amazon Athena 中執行了 CREATE TABLE 陳述式,其中包含預期的資料行及其資料類型。但是,當我執行 SELECT * FROM table-name 查詢時,我收到「Zero records returned」輸出。
解決方法
**注意事項:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
SELECT * FROM table-name 查詢可能傳回零筆記錄有幾個的原因。請根據您的使用案例,參閱相關章節以了解常見原因與疑難排解步驟。
疑難排解 AWS Glue 分區
檢查您的編目程式設定
如果您使用編目程式,請確認編目程式指向 Amazon Simple Storage Service (Amazon S3) 儲存貯體,而不是特定檔案。例如,請使用 s3://amzn-s3-demo-bucket/new,而不是 s3://amzn-s3-demo-bucket/new/data.json。
使用正確的 LOCATION 路徑
請確認輸入資料的 Amazon S3 LOCATION 路徑正確。另外,請確認 S3 儲存貯體路徑不包含檔案或萬用字元。例如,請使用 s3://amzn-s3-demo-bucket/new LOCATION,而不是 s3://amzn-s3-demo-bucket/new/data.json。
在 LOCATION 路徑中使用單一斜線
在 Athena 中,您無法使用包含雙斜線 (//) 的資料表位置路徑。例如,以下 LOCATION 路徑會傳回空白結果:s3://amzn-s3-demo-bucket/myprefix//input//
若要將檔案複製到不含雙斜線的位置,請執行以下 cp AWS CLI 命令:
aws s3 cp s3://amzn-s3-demo-bucket/myprefix//input// s3://amzn-s3-demo-bucket/myprefix/input/ --recursive
**注意事項:**將 amzn-s3-demo-bucket/myprefix//input// 替換為您目前的資料表位置路徑,並將 amzn-s3-demo-bucket/myprefix/input/ 替換為您的新資料表位置路徑。
最佳實務是,您的資料表欄名稱只包含底線或大小寫。例如,您可以將欄命名為 table_name,但不能命名為 table-name。
**注意事項:**AWS Glue 和 Athena 無法讀取駝峰式大小寫、大寫字母,或底線以外的特殊字元。
為每個資料表建立 Amazon S3 首碼
AWS Glue 編目程式會為儲存在相同 Amazon S3 首碼中的資料建立不同的資料表。但是,當您在 Athena 中查詢這些資料表時,會得到零筆記錄。例如,如果您的資料表位置類似以下範例,Athena 查詢將傳回零筆記錄:
- s3://amzn-s3-demo-bucket/table1.csv
- s3://amzn-s3-demo-bucket/table2.csv
若要解決此問題,請為每個資料表建立個別的 Amazon S3 首碼,如以下範例所示:
- s3://amzn-s3-demo-bucket/table1/table1.csv
- s3://amzn-s3-demo-bucket/table2/table2.csv
然後,執行以下查詢以更新您的資料表位置:
ALTER TABLE table1 SET LOCATION 's3://amzn-s3-demo-bucket/table1';
**注意事項:**將 amzn-s3-demo-bucket 替換為您的儲存貯體名稱,並將 table1 替換為您的資料表名稱。
載入您的分區
Athena 只會在您建立資料表時建立中繼資料。只有在您執行查詢時才會剖析資料。如果您的資料表已定義分區,則 AWS Glue Data Catalog 或內部 Athena 資料目錄可能尚未載入分區。
如果 Athena 支援您的分區格式,則請執行 MSCK REPAIR TABLE,將分區的中繼資料載入到目錄中。例如,您有一個以 Year 分區的資料表。在此情況下,Athena 預期會在類似以下範例的 Amazon S3 路徑中找到資料:
- s3://amzn-s3-demo-bucket/athena/inputdata/year=2020/data.csv
- s3://amzn-s3-demo-bucket/athena/inputdata/year=2019/data.csv
- s3://amzn-s3-demo-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://amzn-s3-demo-bucket/athena/inputdata/';
在 Athena 建立資料表後,請執行以下命令以載入分區資訊:
MSCK REPAIR TABLE Employee;
在 Athena 載入資料後,請再次執行以下查詢:
SELECT * FROM Employee;
如果 Athena 不支援您的分區格式,或分區位於不同的 Amazon S3 路徑中,則請針對每個分區執行 ALTER TABLE ADD PARTITION。
例如,您的資料位於以下範例 Amazon S3 路徑:
- s3://amzn-s3-demo-bucket/athena/inputdata/2020/data.csv
- s3://amzn-s3-demo-bucket/athena/inputdata/2019/data.csv
- s3://amzn-s3-demo-bucket/athena/inputdata/2018/data.csv
針對前述路徑,請執行類似以下範例的命令:
ALTER TABLE Employee ADD PARTITION (year=2020) LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/2020/' PARTITION (year=2019) LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/2019/' PARTITION (year=2018) LOCATION 's3://amzn-s3-demo-bucket/athena/inputdata/2018/'
在 Athena 載入資料後,請再次執行以下查詢:
SELECT * FROM Employee;
檢查您的檔案名稱
請確認您的檔案名稱不是以底線或句點開頭。
當您處理查詢時,Athena 會將這些檔案視為預留位置並忽略。如果您 Amazon S3 路徑中的所有檔案名稱都以底線或句點開頭,則會得到零筆記錄。
例如,如果您在 Amazon S3 路徑中使用以下檔案來處理查詢,則會得到零筆記錄:
- s3://amzn-s3-demo-bucket/athena/inputdata/_file1
- s3://amzn-s3-demo-bucket/athena/inputdata/.file2
**注意事項:**如果您的 Amazon S3 路徑包含預留位置與以不同字元開頭的檔案,則 Athena 只會忽略預留位置並查詢其他檔案。因此,您可能會得到一或多筆記錄。
疑難排解分區投影
確認您的值在範圍界限內
如果您的值超出為分區投影定義的範圍界限,則您的查詢會傳回零列。
例如,您的資料從 2020 年開始,而您將其定義如下:projection.timestamp.range'='2020/01/01,NOW
如果您執行以下查詢,查詢會成功完成,但會傳回零列:
SELECT * FROM table-name WHERE timestamp = '2019/02/02'
驗證您的儲存範本分區配置方案
如果您的 Amazon S3 儲存位置未使用 .../column=value... 位置模式,則您必須指定自訂 Amazon S3 分區配置方案。如果您未定義自訂方案,則您的查詢會傳回零筆記錄。
使用正確的自訂儲存範本
如果您使用自訂範本,請確認範本允許 Athena 建置您的分區位置。另外,請確認每個預留位置與 Amazon S3 路徑都以單一正斜線結尾。
例如,您使用 PARTITIONED BY (year string) 資料定義語言 (DDL) 陳述式定義 year 分區欄,而您的儲存位置是 s3://amzn-s3-demo-bucket/athena/inputdata/Year=2022/。此位置會傳回零筆記錄。若要解決此問題,請將儲存位置更新為 s3://amzn-s3-demo-bucket/athena/inputdata/Year=${year}。
驗證您的分區屬性
如果您的分區欄具有 enum、integer、date 或 injected 分區欄類型,請確認您已正確設定分區屬性。組態必須允許 Athena 建置與您在 Amazon S3 上資料結構相符的分區位置。
例如,您的時間相關資料會在每日午夜後 1 小時,傳入 s3://amzn-s3-demo-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://amzn-s3-demo-bucket/athena/inputdata/2022-01-01-00-00。
若要解決此問題,請將 projection.dt.range 屬性設為 2022-01-01-01-00,NOW。
相關資訊
相關內容
- 已提問 3 年前

