

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon Redshift Spectrum 中的查詢故障診斷
<a name="c-spectrum-troubleshooting"></a>



本主題是您可能遇到的 Amazon Redshift Spectrum 常見問題的參考。

查詢 [SVL\$1S3LOG](r_SVL_S3LOG.md) 系統資料表以檢視由 Redshift Spectrum 查詢產生的錯誤。

**Topics**
+ [超過重試次數](#spectrum-troubleshooting-retries-exceeded)
+ [存取已限流](#spectrum-troubleshooting-access-throttled)
+ [超過資源限制](#spectrum-troubleshooting-resource-limit-exceeded)
+ [分割的資料表沒有傳回資料列](#spectrum-troubleshooting-no-rows-partitioned-table)
+ [未授權的錯誤](#spectrum-troubleshooting-not-authorized-error)
+ [不相容的資料格式](#spectrum-troubleshooting-incompatible-data-format)
+ [在 Amazon Redshift 使用 Hive DDL 時的語法錯誤](#spectrum-troubleshooting-syntax-error-using-hive-ddl)
+ [建立暫存資料表的許可](#spectrum-troubleshooting-permission-to-create-temp-tables)
+ [無效的範圍](#spectrum-troubleshooting-invalid-range)
+ [無效的 Parquet 版本編號](#spectrum-troubleshooting-invalid-parquet-version)
+ [外部分割區資訊中缺少必要欄位](#spectrum-troubleshooting-required-field-missing)

## 超過重試次數
<a name="spectrum-troubleshooting-retries-exceeded"></a>

如果 Amazon Redshift Spectrum 請求逾時，則該請求會被取消並重新提交。在五次重試失敗後，該查詢即失敗並顯示以下錯誤。

```
error:  Spectrum Scan Error: Retries exceeded
```

可能的子句包括：
+ 大型檔案 (大於 1 GB)。檢查 Amazon S3 中的檔案大小，尋找大型檔案和檔案大小扭曲。將大型檔案分成許多介於 100 MB 與 1 GB 的較小檔案。試著將檔案維持相同大小。
+ 慢速網路傳輸量。請稍後嘗試您的查詢。

## 存取已限流
<a name="spectrum-troubleshooting-access-throttled"></a>

Amazon Redshift Spectrum 受其他服務的服務配額約束 AWS 。在高使用量下，Redshift Spectrum 請求可能需要減慢速度，因而導致以下錯誤。

```
error:  Spectrum Scan Error: Access throttled
```

可能發生兩種類型的限流：
+ 存取受到 Amazon S3 限流。
+ 由 調節的存取 AWS KMS。

錯誤內容提供有關限流類型的詳細資料。您可以在下面找到此限流的原因和可能的解決方案。

### 存取受到 Amazon S3 限流
<a name="spectrum-troubleshooting-access-throttled-s3"></a>

如果[字首](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html#keyprefix)上的讀取請求率太高，Amazon S3 可能會限流 Redshift Spectrum 請求。如需可在 Amazon S3 中實現的 GET/HEAD 請求率的相關資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[最佳化 Amazon S3 效能](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html)。Amazon S3 GET/HEAD 請求率會將字首上的所有 GET/HEAD 請求列入考慮，因此存取相同字首的不同應用程式共用總請求率。

如果您的 Redshift Spectrum 請求經常受到 Amazon S3 的限流，請減少 Redshift Spectrum 對 Amazon S3 發出的 Amazon S3 GET/HEAD 請求數量。若要執行此動作，請嘗試將小型檔案合併成大型檔案。我們建議使用大於 64 MB 的檔案。

另外，請考慮分割 Redshift Spectrum 資料表，以從早期篩選中獲益，並減少 Amazon S3 中存取的檔案數量。如需詳細資訊，請參閱[分割 Redshift Spectrum 外部資料表](c-spectrum-external-tables.md#c-spectrum-external-tables-partitioning)。

### 由 限流的存取 AWS KMS
<a name="spectrum-troubleshooting-access-throttled-kms"></a>

如果您使用伺服器端加密 (SSE-S3 或 SSE-KMS) 將資料存放在 Amazon S3 中，Amazon S3 AWS KMS 會針對 Redshift Spectrum 存取的每個檔案呼叫 API 操作。這些請求會計入您的密碼編譯操作配額；如需詳細資訊，請參閱 [AWS KMS 請求配額](https://docs.aws.amazon.com/kms/latest/developerguide/requests-per-second.html)。如需 SSE-S3 和 SSE-KMS 的相關資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[使用伺服器端加密保護資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingServerSideEncryption.html)和[搭配使用伺服器端加密與儲存在 AWS KMS中的金鑰來保護資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)。

減少 Redshift Spectrum 對 提出的請求數量的第一步 AWS KMS 是減少存取的檔案數量。若要執行此動作，請嘗試將小型檔案合併成大型檔案。我們建議使用大於 64 MB 的檔案。

如果您的 Redshift Spectrum 請求經常受到調節 AWS KMS，請考慮為您的密碼編譯操作 AWS KMS 請求率請求增加配額。若要申請提高限制，請參閱*Amazon Web Services 一般參考*中的 [AWS 服務限制](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)。

## 超過資源限制
<a name="spectrum-troubleshooting-resource-limit-exceeded"></a>

Redshift Spectrum 會對請求可以使用的記憶體數量強加上限。需要更多記憶體的 Redshift Spectrum 請求失敗，導致下列錯誤。

```
error:  Spectrum Scan Error: Resource limit exceeded
```

有兩個常見的原因可能會造成 Redshift Spectrum 請求超出其記憶體限額：
+ Redshift Spectrum 會處理大塊資料，這些資料不能以較小的區塊分割。
+ 大型彙總步驟是由 Redshift Spectrum 處理。

建議您使用支援平行讀取的檔案格式，分割大小為 128 MB 或更少。如需支援的檔案格式和建立資料檔的一般指導方針，請參閱[Amazon Redshift Spectrum 中查詢的資料檔案](c-spectrum-data-files.md)。使用不支援平行讀取的檔案格式或壓縮演算法時，建議您將檔案大小保持在 64 MB 與 128 MB 之間。

## 分割的資料表沒有傳回資料列
<a name="spectrum-troubleshooting-no-rows-partitioned-table"></a>

如果您的查詢沒有從分割的外部資料表傳回任何資料列，請檢查是否已為此外部資料表新增分割區。Redshift Spectrum 僅會掃描使用 `ALTER TABLE … ADD PARTITION` 明確新增之 Amazon S3 位置中的檔案。請查詢 [SVV\$1EXTERNAL\$1PARTITIONS](r_SVV_EXTERNAL_PARTITIONS.md) 畫面以尋找現有分割區。針對每個缺少的分割區執行 `ALTER TABLE … ADD PARTITION`。

## 未授權的錯誤
<a name="spectrum-troubleshooting-not-authorized-error"></a>

請確認叢集的 IAM 角色是否允許存取 Amazon S3 檔案物件。如果您的外部資料庫位於 Amazon Athena 上，請確認 IAM 角色是否允許存取 Athena 資源。如需詳細資訊，請參閱[Amazon Redshift Spectrum 的 IAM 政策](c-spectrum-iam-policies.md)。

## 不相容的資料格式
<a name="spectrum-troubleshooting-incompatible-data-format"></a>

對於單欄檔案格式 (如 Apache Parquet)，該欄位類型已嵌入了資料。CREATE EXTERNAL TABLE 定義中的欄位類型必須與資料檔案的欄位類型相符。如果有不相符的部分，您將收到類似以下的錯誤訊息：

```
File 'https://s3bucket/location/file has an incompatible Parquet schema
for column ‘s3://s3bucket/location.col1'. Column type: VARCHAR, Par
```

由於訊息長度限制，錯誤訊息可能會被截斷。若要獲取包含欄位名稱與欄位類型的完整錯誤訊息，請查詢 [SVL\$1S3LOG](r_SVL_S3LOG.md) 系統畫面。

以下範例會查詢 SVL\$1S3LOG 以取得最後完成的查詢。

```
select message 
from svl_s3log 
where query = pg_last_query_id() 
order by query,segment,slice;
```

以下是顯示完整錯誤訊息的結果範例。

```
                            message
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
Spectrum Scan Error. File 'https://s3bucket/location/file has an incompatible
Parquet schema for column ' s3bucket/location.col1'. 
Column type: VARCHAR, Parquet schema:\noptional int64 l_orderkey [i:0 d:1 r:0]\n
```

若要更正此錯誤，請修改外部資料表以符合 Parquet 檔案的欄位類型。

## 在 Amazon Redshift 使用 Hive DDL 時的語法錯誤
<a name="spectrum-troubleshooting-syntax-error-using-hive-ddl"></a>

Amazon Redshift 支援 CREATE EXTERNAL TABLE 的資料定義語言 (DDL) (類似於 Hive DDL)。但是，這兩種類型的 DDL 有時並不完全相同。如果您複製了 Hive DDL 以建立或更改 Amazon Redshift 外部資料表，則可能會遇到語法錯誤。以下是 Amazon Redshift 與 Hive DDL 之間的差異範例：
+ Amazon Redshift 需要單引號 (')，而 Hive DDL 支援雙引號 (")。
+ Amazon Redshift 不支援 STRING 資料類型。請改用 VARCHAR。

## 建立暫存資料表的許可
<a name="spectrum-troubleshooting-permission-to-create-temp-tables"></a>

要執行 Redshift Spectrum 查詢，資料庫使用者必須具有在資料庫中建立臨時資料表的許可。下列範例可在資料庫 `spectrumdb` 上授予臨時許可至 `spectrumusers` 使用者群組。

```
grant temp on database spectrumdb  to group spectrumusers;
```

如需詳細資訊，請參閱[GRANT](r_GRANT.md)。

## 無效的範圍
<a name="spectrum-troubleshooting-invalid-range"></a>

Redshift Spectrum 預期 Amazon S3 中屬於外部資料表的檔案在查詢期間不會被覆寫。如果發生這種情況，可能會導致以下錯誤。

```
Error: HTTP response error code: 416 Message: InvalidRange The requested range is not satisfiable
```

為避免發生錯誤，請確定 Amazon S3 檔案在使用 Redshift Spectrum 查詢時不會覆寫這些檔案。

## 無效的 Parquet 版本編號
<a name="spectrum-troubleshooting-invalid-parquet-version"></a>

Redshift Spectrum 會檢查它存取的每個 Apache Parquet 檔案的中繼資料。若檢查失敗，可能會導致類似下列內容的錯誤：

```
File 'https://s3.region.amazonaws.com/s3bucket/location/file has an invalid version number
```

導致檢查失敗的常見原因有兩個：
+ Parquet 檔案在查詢期間已被覆寫 (請參閱[無效的範圍](#spectrum-troubleshooting-invalid-range))。
+ Parquet 檔案已損毀。

## 外部分割區資訊中缺少必要欄位
<a name="spectrum-troubleshooting-required-field-missing"></a>

當您嘗試將分割區新增至外部目錄中的外部資料表時，您可能會收到下列錯誤：

```
Error: The required field (<field_name>) is missing from the external partition information. Add missing field in partition and retry. Partition location: <partition_path>
```

此錯誤表示，您查詢中使用的外部資料表中的其中一個分割區缺少分割區中繼資料資訊。以下情況可能發生此錯誤：
+  您已將分割區新增至外部目錄中的外部資料表，例如 AWS Glue Data Catalog，其中包含部分資訊。
+  您在 Amazon Redshift 中查詢分割的資料表，同時新增或更新外部目錄中對應資料表的分割區，例如 AWS Glue Data Catalog。

以下是從 AWS Glue Data Catalog擷取分割區時必須填入的欄位：
+  StorageDescriptor 
  +  InputFormat 
  +  OutputFormat 
  +  SerDeInfo 
+  值 

您可以查詢 [SVV\$1EXTERNAL\$1PARTITIONS](r_SVV_EXTERNAL_PARTITIONS.md) 來尋找現有的分割區，並查看其欄位的詳細資訊。

如需 AWS Glue Data Catalog 分割區欄位的完整清單，請參閱 *AWS Glue Web API 參考*中的[分割區](https://docs.aws.amazon.com/glue/latest/webapi/API_Partition.html)。