

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Gunakan partisi dan bucketing
<a name="ctas-partitioning-and-bucketing"></a>

Partisi dan bucketing adalah dua cara untuk mengurangi jumlah data Athena harus memindai ketika Anda menjalankan kueri. Partisi dan bucketing saling melengkapi dan dapat digunakan bersama. Mengurangi jumlah data yang dipindai mengarah pada peningkatan kinerja dan biaya yang lebih rendah. Untuk panduan umum tentang performa kueri Athena, lihat [10 kiat penyetelan performa terbaik untuk Amazon Athena](https://aws.amazon.com/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/).

**Topics**
+ [Apa itu partisi?](ctas-partitioning-and-bucketing-what-is-partitioning.md)
+ [Apa itu bucketing?](ctas-partitioning-and-bucketing-what-is-bucketing.md)
+ [Sumber daya tambahan](ctas-partitioning-and-bucketing-additional-resources.md)

# Apa itu partisi?
<a name="ctas-partitioning-and-bucketing-what-is-partitioning"></a>

Partisi berarti mengatur data ke dalam direktori (atau “awalan”) di Amazon S3 berdasarkan properti data tertentu. Properti seperti itu disebut kunci partisi. Kunci partisi umum adalah tanggal atau satuan waktu lainnya seperti tahun atau bulan. Namun, dataset dapat dipartisi oleh lebih dari satu kunci. Misalnya, data tentang penjualan produk dapat dipartisi berdasarkan tanggal, kategori produk, dan pasar.

## Memutuskan cara partisi
<a name="ctas-partitioning-and-bucketing-deciding-how-to-partition"></a>

Kandidat yang baik untuk kunci partisi adalah properti yang selalu atau sering digunakan dalam kueri dan memiliki kardinalitas rendah. Ada trade-off antara memiliki terlalu banyak partisi dan memiliki terlalu sedikit. Dengan terlalu banyak partisi, peningkatan jumlah file menciptakan overhead. Ada juga beberapa overhead dari penyaringan partisi itu sendiri. Dengan terlalu sedikit partisi, kueri seringkali harus memindai lebih banyak data.

## Buat tabel yang dipartisi
<a name="ctas-partitioning-and-bucketing-creating-a-partitioned-table"></a>

Saat kumpulan data dipartisi, Anda dapat membuat tabel yang dipartisi di Athena. Tabel yang dipartisi adalah tabel yang memiliki kunci partisi. Saat Anda menggunakan`CREATE TABLE`, Anda menambahkan partisi ke tabel. Saat Anda menggunakan`CREATE TABLE AS`, partisi yang dibuat di Amazon S3 secara otomatis ditambahkan ke tabel.

Dalam sebuah `CREATE TABLE` pernyataan, Anda menentukan kunci partisi dalam `PARTITIONED BY (column_name data_type)` klausa. Dalam sebuah `CREATE TABLE AS` pernyataan, Anda menentukan kunci partisi dalam `WITH (partitioned_by = ARRAY['partition_key'])` klausa, atau `WITH (partitioning = ARRAY['partition_key'])` untuk tabel Iceberg. Untuk alasan kinerja, kunci partisi harus selalu bertipe`STRING`. Untuk informasi selengkapnya, lihat [Gunakan string sebagai tipe data untuk kunci partisi](data-types-timestamps.md#data-types-timestamps-partition-key-types).

Untuk detail tambahan `CREATE TABLE` dan `CREATE TABLE AS` sintaks, lihat [CREATE TABLE](create-table.md) dan[Properti tabel CTAS](create-table-as.md#ctas-table-properties).

## Tabel yang dipartisi kueri
<a name="ctas-partitioning-and-bucketing-querying-partitioned-tables"></a>

Saat Anda menanyakan tabel yang dipartisi, Athena menggunakan predikat dalam kueri untuk memfilter daftar partisi. Kemudian menggunakan lokasi partisi yang cocok untuk memproses file yang ditemukan. Athena dapat secara efisien mengurangi jumlah data yang dipindai hanya dengan tidak membaca data di partisi yang tidak cocok dengan predikat kueri.

### Contoh
<a name="ctas-partitioning-and-bucketing-partitioned-table-example-queries"></a>

Misalkan Anda memiliki tabel yang dipartisi oleh `sales_date` `product_category` dan dan ingin mengetahui total pendapatan selama seminggu dalam kategori tertentu. Anda menyertakan `sales_date` predikat pada `product_category` kolom dan untuk memastikan bahwa Athena hanya memindai jumlah minimum data, seperti pada contoh berikut.

```
SELECT SUM(amount) AS total_revenue 
FROM sales 
WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' 
AND product_category = 'Toys'
```

Misalkan Anda memiliki kumpulan data yang dipartisi berdasarkan tanggal tetapi juga memiliki stempel waktu berbutir halus.

Dengan tabel Iceberg, Anda dapat mendeklarasikan kunci partisi untuk memiliki hubungan dengan kolom, tetapi dengan tabel Hive mesin kueri tidak memiliki pengetahuan tentang hubungan antara kolom dan kunci partisi. Untuk alasan ini, Anda harus menyertakan predikat pada kolom dan kunci partisi dalam kueri Anda untuk memastikan kueri tidak memindai lebih banyak data daripada yang diperlukan.

Misalnya, `sales` tabel pada contoh sebelumnya juga memiliki `sold_at` kolom tipe `TIMESTAMP` data. Jika Anda menginginkan pendapatan hanya untuk rentang waktu tertentu, Anda akan menulis kueri seperti ini:

```
SELECT SUM(amount) AS total_revenue 
FROM sales 
WHERE sales_date = '2023-02-28' 
AND sold_at BETWEEN TIMESTAMP '2023-02-28 10:00:00' AND TIMESTAMP '2023-02-28 12:00:00' 
AND product_category = 'Toys'
```

Untuk informasi selengkapnya tentang perbedaan antara menanyakan tabel Hive dan Iceberg, lihat. [Cara menulis kueri untuk bidang stempel waktu yang juga dipartisi waktu](data-types-timestamps.md#data-types-timestamps-how-to-write-queries-for-timestamp-fields-that-are-also-time-partitioned)

# Apa itu bucketing?
<a name="ctas-partitioning-and-bucketing-what-is-bucketing"></a>

Bucketing adalah cara untuk mengatur catatan dataset ke dalam kategori yang disebut bucket.

Arti bucket dan bucketing ini berbeda dari, dan jangan bingung dengan, ember Amazon S3. Dalam bucketing data, catatan yang memiliki nilai yang sama untuk properti masuk ke bucket yang sama. Catatan didistribusikan secara merata di antara ember sehingga setiap bucket memiliki jumlah data yang kira-kira sama.

Dalam praktiknya, bucket adalah file, dan fungsi hash menentukan bucket yang masuk ke dalam rekaman. Dataset yang diselimuti akan memiliki satu atau lebih file per bucket per partisi. Bucket yang dimiliki file dikodekan dalam nama file.

## Manfaat Bucketing
<a name="ctas-partitioning-and-bucketing-bucketing-benefits"></a>

Bucketing berguna ketika kumpulan data diselimuti oleh properti tertentu dan Anda ingin mengambil catatan di mana properti tersebut memiliki nilai tertentu. Karena datanya diselimuti, Athena dapat menggunakan nilainya untuk menentukan file mana yang akan dilihat. Misalnya, dataset diselimuti oleh `customer_id` dan Anda ingin menemukan semua catatan untuk pelanggan tertentu. Athena menentukan ember yang berisi catatan itu dan hanya membaca file di ember itu.

Kandidat yang baik untuk bucketing terjadi ketika Anda memiliki kolom yang memiliki kardinalitas tinggi (yaitu, memiliki banyak nilai berbeda), terdistribusi secara seragam, dan Anda sering meminta nilai tertentu.

**catatan**  
Athena tidak mendukung penggunaan `INSERT INTO` untuk menambahkan catatan baru ke tabel berember.

## Tipe data yang didukung untuk pemfilteran pada kolom berember
<a name="ctas-partitioning-and-bucketing-data-types-supported-for-filtering-on-bucketed-columns"></a>

Anda dapat menambahkan filter pada kolom berember dengan tipe data tertentu. Athena mendukung penyaringan pada kolom berember dengan tipe data berikut:
+ BOOLEAN
+ BYTE
+ DATE
+ DOUBLE
+ FLOAT
+ INT
+ LONG
+ SHORT
+ STRING
+ VARCHAR

## Dukungan Hive dan Spark
<a name="ctas-partitioning-and-bucketing-hive-and-spark-support"></a>

Mesin Athena versi 2 mendukung kumpulan data yang diselimuti menggunakan algoritma bucket Hive, dan mesin Athena versi 3 juga mendukung algoritma bucketing Apache Spark. Bucketing sarang adalah default. Jika kumpulan data Anda diselimuti menggunakan algoritma Spark, gunakan `TBLPROPERTIES` klausa untuk menyetel nilai properti. `bucketing_format` `spark`

**catatan**  
Athena memiliki batas 100 partisi dalam kueri `CREATE TABLE AS SELECT` ([CTAS](ctas.md)). Demikian pula, Anda hanya dapat menambahkan maksimum 100 partisi ke tabel tujuan dengan [INSERT INTO](insert-into.md) pernyataan.  
Jika Anda melebihi batasan ini, Anda mungkin menerima pesan kesalahan HIVE\$1TOO\$1MANY\$1OPEN\$1PARTITIONS: Melebihi batas 100 penulis terbuka untuk partisi/ember. Untuk mengatasi batasan ini, Anda dapat menggunakan pernyataan CTAS dan serangkaian `INSERT INTO` pernyataan yang membuat atau menyisipkan hingga 100 partisi masing-masing. Untuk informasi selengkapnya, lihat [Gunakan CTAS dan INSERT INTO untuk bekerja di sekitar batas partisi 100](ctas-insert-into.md).

## Bucketing CREATE TABLE contoh
<a name="ctas-partitioning-and-bucketing-bucketing-create-table-example"></a>

Untuk membuat tabel untuk dataset bucketed yang ada, gunakan klausa yang diikuti oleh `CLUSTERED BY (column)` klausa. `INTO N BUCKETS` `INTO N BUCKETS`Klausa menentukan jumlah ember yang dimasukkan ke dalam data.

Dalam `CREATE TABLE` contoh berikut, `sales` kumpulan data dimasukkan `customer_id` ke dalam 8 ember menggunakan algoritma Spark. `CREATE TABLE`Pernyataan menggunakan `TBLPROPERTIES` klausa `CLUSTERED BY` and untuk mengatur properti yang sesuai.

```
CREATE EXTERNAL TABLE sales (...) 
... 
CLUSTERED BY (`customer_id`) INTO 8 BUCKETS 
... 
TBLPROPERTIES ( 
  'bucketing_format' = 'spark' 
)
```

## Bucketing CREATE TABLE AS (CTAS) contoh
<a name="ctas-partitioning-and-bucketing-bucketing-create-table-as-example"></a>

Untuk menentukan ember dengan`CREATE TABLE AS`, gunakan `bucket_count` parameter `bucketed_by` dan, seperti pada contoh berikut.

```
CREATE TABLE sales 
WITH ( 
  ... 
  bucketed_by = ARRAY['customer_id'], 
  bucket_count = 8 
) 
AS SELECT ...
```

## Contoh kueri bucketing
<a name="ctas-partitioning-and-bucketing-bucketing-query-example"></a>

Contoh kueri berikut mencari nama-nama produk yang telah dibeli pelanggan tertentu selama seminggu.

```
SELECT DISTINCT product_name 
FROM sales 
WHERE sales_date BETWEEN '2023-02-27' AND '2023-03-05' 
AND customer_id = 'c123'
```

Jika tabel ini dipartisi oleh `sales_date` dan dikantongi oleh`customer_id`, Athena dapat menghitung ember tempat catatan pelanggan berada. Paling-paling, Athena membaca satu file per partisi.

# Sumber daya tambahan
<a name="ctas-partitioning-and-bucketing-additional-resources"></a>
+ Untuk `CREATE TABLE AS` contoh yang membuat tabel berember dan dipartisi, lihat [Contoh: Membuat](https://docs.aws.amazon.com/athena/latest/ug/ctas-examples.html#ctas-example-bucketed) tabel berember dan dipartisi.
+ [Untuk informasi tentang penerapan bucketing pada AWS data lake, termasuk menggunakan pernyataan Athena CTAS, AWS Glue untuk Apache Spark, dan bucketing untuk tabel Apache Iceberg, lihat posting AWS Blog Big Data Optimalkan tata letak data dengan menggunakan Amazon Athena dan untuk mempercepat kueri hilir. AWS Glue](https://aws.amazon.com/blogs/big-data/optimize-data-layout-by-bucketing-with-amazon-athena-and-aws-glue-to-accelerate-downstream-queries/) 