跳至內容

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

2 分的閱讀內容
0

我在 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

相關資訊

在 Athena 中建立資料表

使用編目程式新增資料表

設定分區投影

AWS 官方已更新 6 個月前