

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

# 分割您的資料
<a name="partitions"></a>

您可以分割資料，以限制每個查詢所掃描的資料量，從而提高效能和降低成本。您可透過任何索引鍵來分割您的資料。常見做法是根據時間來分割資料，這通常會產生多層級的分割機制。例如，每小時都有資料傳入的客戶可能決定依年、月、日、小時來分割。另一個客戶的資料來自許多不同來源，且每天只載入一次，則可能依資料來源識別符和日期來分割。

Athena 可以使用 Apache Hive 樣式的分割區，其資料路徑包含由等號連接的鍵值對 (例如 `country=us/...` 或 `year=2021/month=01/day=26/...`)。因此，路徑會包含分割區索引鍵的名稱，以及每個路徑所代表的值。若要將新的 Hive 分割區載入已分割的資料表，您可以使用 [MSCK REPAIR TABLE](msck-repair-table.md) 命令，其只適用於 Hive 樣式的分割區。

Athena 也可以使用非 Hive 樣式的分割區結構描述。例如，CloudTrail 日誌和 Firehose 交付串流對日期部分使用不同的路徑元件，例如 `data/2021/01/26/us/6fc7845e.json`。對於這類非 Hive 樣式的分割區，您可以使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 手動新增分割區。

## 考量和限制
<a name="partitions-considerations-limitations"></a>

使用分割區時，請謹記以下幾點：
+ 若您查詢已分割的資料表並在 `WHERE` 子句中指定分割區，Athena 便只會掃描該分割區中的資料。
+ 如果您對 Amazon S3 儲存貯體發出具有大量物件的查詢，並且未將資料分割，這類查詢可能會影響 Amazon S3 中的 `GET` 請求率限制，並導致 Amazon S3 例外狀況。若要避免錯誤，請分割您的資料。此外，請考慮調校您的 Amazon S3 請求率。如需詳細資訊，請參閱[最佳實務設計模式：最佳化 Amazon S3 效能](https://docs.aws.amazon.com/AmazonS3/latest/userguide/request-rate-perf-considerations.html)。
+ 要搭配 Athena 使用的分割區位置必須使用 `s3` 通訊協定 (例如，`s3://amzn-s3-demo-bucket/folder/`)。在 Athena 中，當在包含的資料表上執行 `MSCK REPAIR TABLE` 查詢時，使用其他通訊協定的位置 (例如 `s3a://amzn-s3-demo-bucket/folder/`) 會導致查詢失敗。
+ 請確定 Amazon S3 路徑是小寫而不是小駝峰式命名法 (camel case) (例如，`userid` 而非 `userId`)。如果 S3 路徑是小駝峰式命名法 (camel case)，則 `MSCK REPAIR TABLE` 不會將分割區新增到 AWS Glue Data Catalog。如需詳細資訊，請參閱 [MSCK REPAIR TABLE](msck-repair-table.md)。
+ 由於 `MSCK REPAIR TABLE` 會同時掃描資料夾及其子資料夾，以尋找相符的分割區配置，請務必將個別資料表的資料留在不同的資料夾階層中。例如，假設您在 `s3://amzn-s3-demo-bucket1` 中有資料表 1 的資料，在 `s3://amzn-s3-demo-bucket1/table-2-data` 中有資料表 2 的資料。如果兩個資料表都以字串分割，`MSCK REPAIR TABLE` 會將資料表 2 的分割區新增至資料表 1 中。為避免此情況，請改用單獨的資料夾結構，如 `s3://amzn-s3-demo-bucket1` 和 `s3://amzn-s3-demo-bucket2`。請注意，此行為與 Amazon EMR 和 Apache Hive 一致。
+ 如果您將 AWS Glue Data Catalog 與 Athena 搭配使用，請參閱每個帳戶[AWS Glue 和每個資料表分割區上服務配額的端點](https://docs.aws.amazon.com/general/latest/gr/glue.html)和配額。
  + 雖然 Athena 支援查詢具有 1，000 萬個分割區的 AWS Glue 資料表，但 Athena 無法在單一掃描中讀取超過 100 萬個分割區。在這種情況下，分割區索引可能有利。如需詳細資訊，請參閱 AWS 大數據部落格文章[使用 AWS Glue Data Catalog 分割區索引改善 Amazon Athena 查詢效能](https://aws.amazon.com/blogs/big-data/improve-amazon-athena-query-performance-using-aws-glue-data-catalog-partition-indexes/)。
+ 若要在使用 時請求增加分割區配額 AWS Glue Data Catalog，請造訪 [Service Quotas 主控台 AWS Glue](https://console.aws.amazon.com/servicequotas/home?region=us-east-1#!/services/glue/quotas)。

## 建立和載入含有分割資料的資料表
<a name="partitions-creating-loading"></a>

若要建立使用分割區的資料表，請在 [CREATE TABLE](create-table.md) 陳述式中使用 `PARTITIONED BY` 子句。`PARTITIONED BY` 子句定義對資料進行分割區的索引鍵，如下列範例所示。`LOCATION` 子句指定已分割的資料的根位置。

```
CREATE EXTERNAL TABLE users (
first string,
last string,
username string
)
PARTITIONED BY (id string)
STORED AS parquet
LOCATION 's3://amzn-s3-demo-bucket'
```

建立資料表之後，您可以在分割區中載入要查詢的資料。對於 Hive 樣式的分割區，您可以執行 [MSCK REPAIR TABLE](msck-repair-table.md)。對於非 Hive 樣式的分割區，您可以使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 手動新增分割區。

## 準備 Hive 樣式和非 Hive 樣式資料進行查詢
<a name="partitions-preparing-data"></a>

下列區段說明如何準備 Hive 樣式和非 Hive 樣式資料，以便在 Athena 中進行查詢。

### 案例 1：以 Hive 格式存放在 Amazon S3 上的資料
<a name="scenario-1-data-already-partitioned-and-stored-on-s3-in-hive-format"></a>

在此案例中，分割區存放在 Amazon S3 中的單獨資料夾。例如，以下是 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/ls.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/ls.html) 命令輸出的廣告曝光範例的部分清單，其中列出了指定字首下的 S3 物件：

```
aws s3 ls s3://elasticmapreduce/samples/hive-ads/tables/impressions/

    PRE dt=2009-04-12-13-00/
    PRE dt=2009-04-12-13-05/
    PRE dt=2009-04-12-13-10/
    PRE dt=2009-04-12-13-15/
    PRE dt=2009-04-12-13-20/
    PRE dt=2009-04-12-14-00/
    PRE dt=2009-04-12-14-05/
    PRE dt=2009-04-12-14-10/
    PRE dt=2009-04-12-14-15/
    PRE dt=2009-04-12-14-20/
    PRE dt=2009-04-12-15-00/
    PRE dt=2009-04-12-15-05/
```

在此，存放的日誌將欄名稱 (dt) 設為等於日期、小時和分鐘增量。當您在 DDL 中提供父資料夾的位置、結構描述和分割欄的名稱時，Athena 就能在這些子資料夾中查詢資料。

#### 建立資料表
<a name="creating-a-table"></a>

若要使用此資料建立資料表，請沿著 'dt' 建立分割區，如下列 Athena DDL 陳述式所示：

```
CREATE EXTERNAL TABLE impressions (
    requestBeginTime string,
    adId string,
    impressionId string,
    referrer string,
    userAgent string,
    userCookie string,
    ip string,
    number string,
    processId string,
    browserCookie string,
    requestEndTime string,
    timers struct<modelLookup:string, requestTime:string>,
    threadId string,
    hostname string,
    sessionId string)
PARTITIONED BY (dt string)
ROW FORMAT  serde 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://elasticmapreduce/samples/hive-ads/tables/impressions/' ;
```

此資料表使用 Hive 的原生 JSON 序列化程式-還原序列化程式，讀取存放在 Amazon S3 中的 JSON 資料。如需支援格式的詳細資訊，請參閱[為您的資料選擇 SerDe](supported-serdes.md)。

#### 執行 MSCK REPAIR TABLE
<a name="run-msck-repair-table"></a>

在您執行 `CREATE TABLE` 查詢後，在 Athena 查詢編輯器中執行 `MSCK REPAIR TABLE` 命令以載入分割區，如下列範例所示。

```
MSCK REPAIR TABLE impressions
```

執行此命令後，即可對資料進行查詢。

#### 查詢資料
<a name="query-the-data"></a>

使用分割區欄位查詢 impressions 資料表的資料。範例如下：

```
SELECT dt,impressionid FROM impressions WHERE dt<'2009-04-12-14-00' and dt>='2009-04-12-13-00' ORDER BY dt DESC LIMIT 100
```

此查詢應該會顯示類似下列的資料：

```
2009-04-12-13-20    ap3HcVKAWfXtgIPu6WpuUfAfL0DQEc
2009-04-12-13-20    17uchtodoS9kdeQP1x0XThKl5IuRsV
2009-04-12-13-20    JOUf1SCtRwviGw8sVcghqE5h0nkgtp
2009-04-12-13-20    NQ2XP0J0dvVbCXJ0pb4XvqJ5A4QxxH
2009-04-12-13-20    fFAItiBMsgqro9kRdIwbeX60SROaxr
2009-04-12-13-20    V4og4R9W6G3QjHHwF7gI1cSqig5D1G
2009-04-12-13-20    hPEPtBwk45msmwWTxPVVo1kVu4v11b
2009-04-12-13-20    v0SkfxegheD90gp31UCr6FplnKpx6i
2009-04-12-13-20    1iD9odVgOIi4QWkwHMcOhmwTkWDKfj
2009-04-12-13-20    b31tJiIA25CK8eDHQrHnbcknfSndUk
```

### 案例 2：資料未分割 (Hive 格式)
<a name="scenario-2-data-is-not-partitioned"></a>

在下列範例中，`aws s3 ls` 命令顯示存放在 Amazon S3 中的 [ELB](elasticloadbalancer-classic-logs.md) 日誌。請注意，資料配置如何不使用 `key=value` 對，因此不屬於 Hive 格式。(`aws s3 ls` 命令的 `--recursive` 選項指定列出指定目錄或字首下的所有檔案或物件。)

```
aws s3 ls s3://athena-examples-myregion/elb/plaintext/ --recursive

2016-11-23 17:54:46   11789573 elb/plaintext/2015/01/01/part-r-00000-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:46    8776899 elb/plaintext/2015/01/01/part-r-00001-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:46    9309800 elb/plaintext/2015/01/01/part-r-00002-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47    9412570 elb/plaintext/2015/01/01/part-r-00003-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47   10725938 elb/plaintext/2015/01/01/part-r-00004-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:46    9439710 elb/plaintext/2015/01/01/part-r-00005-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47          0 elb/plaintext/2015/01/01_$folder$
2016-11-23 17:54:47    9012723 elb/plaintext/2015/01/02/part-r-00006-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47    7571816 elb/plaintext/2015/01/02/part-r-00007-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:47    9673393 elb/plaintext/2015/01/02/part-r-00008-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48   11979218 elb/plaintext/2015/01/02/part-r-00009-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48    9546833 elb/plaintext/2015/01/02/part-r-00010-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48   10960865 elb/plaintext/2015/01/02/part-r-00011-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48          0 elb/plaintext/2015/01/02_$folder$
2016-11-23 17:54:48   11360522 elb/plaintext/2015/01/03/part-r-00012-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48   11211291 elb/plaintext/2015/01/03/part-r-00013-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:48    8633768 elb/plaintext/2015/01/03/part-r-00014-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:49   11891626 elb/plaintext/2015/01/03/part-r-00015-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:49    9173813 elb/plaintext/2015/01/03/part-r-00016-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:49   11899582 elb/plaintext/2015/01/03/part-r-00017-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:49          0 elb/plaintext/2015/01/03_$folder$
2016-11-23 17:54:50    8612843 elb/plaintext/2015/01/04/part-r-00018-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:50   10731284 elb/plaintext/2015/01/04/part-r-00019-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:50    9984735 elb/plaintext/2015/01/04/part-r-00020-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:50    9290089 elb/plaintext/2015/01/04/part-r-00021-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:50    7896339 elb/plaintext/2015/01/04/part-r-00022-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    8321364 elb/plaintext/2015/01/04/part-r-00023-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51          0 elb/plaintext/2015/01/04_$folder$
2016-11-23 17:54:51    7641062 elb/plaintext/2015/01/05/part-r-00024-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51   10253377 elb/plaintext/2015/01/05/part-r-00025-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    8502765 elb/plaintext/2015/01/05/part-r-00026-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51   11518464 elb/plaintext/2015/01/05/part-r-00027-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    7945189 elb/plaintext/2015/01/05/part-r-00028-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    7864475 elb/plaintext/2015/01/05/part-r-00029-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51          0 elb/plaintext/2015/01/05_$folder$
2016-11-23 17:54:51   11342140 elb/plaintext/2015/01/06/part-r-00030-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:51    8063755 elb/plaintext/2015/01/06/part-r-00031-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52    9387508 elb/plaintext/2015/01/06/part-r-00032-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52    9732343 elb/plaintext/2015/01/06/part-r-00033-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52   11510326 elb/plaintext/2015/01/06/part-r-00034-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52    9148117 elb/plaintext/2015/01/06/part-r-00035-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52          0 elb/plaintext/2015/01/06_$folder$
2016-11-23 17:54:52    8402024 elb/plaintext/2015/01/07/part-r-00036-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52    8282860 elb/plaintext/2015/01/07/part-r-00037-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:52   11575283 elb/plaintext/2015/01/07/part-r-00038-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:53    8149059 elb/plaintext/2015/01/07/part-r-00039-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:53   10037269 elb/plaintext/2015/01/07/part-r-00040-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:53   10019678 elb/plaintext/2015/01/07/part-r-00041-ce65fca5-d6c6-40e6-b1f9-190cc4f93814.txt
2016-11-23 17:54:53          0 elb/plaintext/2015/01/07_$folder$
2016-11-23 17:54:53          0 elb/plaintext/2015/01_$folder$
2016-11-23 17:54:53          0 elb/plaintext/2015_$folder$
```

#### 執行 ALTER TABLE ADD PARTITION
<a name="run-alter-table-add-partition"></a>

因為資料不是 Hive 格式，您無法在建立資料表後，使用 `MSCK REPAIR TABLE` 命令將分割區新增至該資料表。相反，您可以使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 命令以手動新增每個分割區。例如，如需載入 s3://athena-examples-*myregion*/elb/plaintext/2015/01/01/ 中的資料，您可以執行下列查詢：請注意，每個 Amazon S3 資料夾不需要單獨的分割區資料欄，且分割區鍵值可與 Amazon S3 索引鍵不同。

```
ALTER TABLE elb_logs_raw_native_part ADD PARTITION (dt='2015-01-01') location 's3://athena-examples-us-west-1/elb/plaintext/2015/01/01/'
```

如果已具有分割區，您會收到 Partition already exists (分割區已存在) 錯誤。若要避免發生此錯誤，您可以使用 `IF NOT EXISTS` 子句。如需詳細資訊，請參閱[ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。如需移除分割區，請使用 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)。

## 考慮分割區投影
<a name="partitions-partition-projection"></a>

若要避免必須自行管理分割區，您可以使用分割區投影。分割區投影是高度已分割的資料表，其結構是提前已知的選項。在分割區投影中，分割區的值和位置是以您所設定的資料表屬性計算，而不是從中繼資料儲存庫所讀取到的來計算。因為記憶體中的計算是比遠端查詢更快，分割區投影的使用可以大幅減少查詢執行時間。

如需詳細資訊，請參閱[透過 Amazon Athena 使用分割區投影](partition-projection.md)。

## 其他資源
<a name="partitions-additional-resources"></a>
+ 如需有關 Firehose 資料分割選項的資訊，請參閱 [Amazon Data Firehose 範例](partition-projection-kinesis-firehose-example.md)。
+ 您可以使用 [JDBC 驅動程式](connect-with-jdbc.md)來自動新增分割區。
+ 您可以使用 CTAS 和 INSERT INTO 來分割資料集。如需詳細資訊，請參閱[使用 CTAS 和 INSERT INTO 以進行 ETL 和資料分析](ctas-insert-into-etl.md)。