

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

# Contoh Amazon Data Firehose
<a name="partition-projection-kinesis-firehose-example"></a>

Saat Anda menggunakan Firehose untuk mengirimkan data ke Amazon S3, konfigurasi default akan menulis objek dengan kunci yang terlihat seperti contoh berikut:

```
s3://amzn-s3-demo-bucket/prefix/yyyy/MM/dd/HH/file.extension
```

Untuk membuat tabel Athena yang menemukan partisi secara otomatis pada waktu kueri, alih-alih harus menambahkannya ke AWS Glue Data Catalog saat data baru tiba, Anda dapat menggunakan proyeksi partisi.

`CREATE TABLE`Contoh berikut menggunakan konfigurasi Firehose default.

```
CREATE EXTERNAL TABLE my_ingested_data (
 ...
)
...
PARTITIONED BY (
 datehour STRING
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
 "projection.enabled" = "true",
 "projection.datehour.type" = "date",
 "projection.datehour.format" = "yyyy/MM/dd/HH",
 "projection.datehour.range" = "2021/01/01/00,NOW",
 "projection.datehour.interval" = "1",
 "projection.datehour.interval.unit" = "HOURS",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${datehour}/"
)
```

`TBLPROPERTIES`Klausul dalam `CREATE TABLE` pernyataan tersebut memberi tahu Athena sebagai berikut:
+ Gunakan proyeksi partisi saat menanyakan tabel
+ Kunci partisi `datehour` adalah tipe `date` (yang mencakup waktu opsional)
+ Bagaimana tanggal diformat
+ Kisaran waktu tanggal. Perhatikan bahwa nilai harus dipisahkan dengan koma, bukan tanda hubung.
+ Di mana menemukan data di Amazon S3.

Saat Anda menanyakan tabel, Athena menghitung nilai untuk `datehour` dan menggunakan templat lokasi penyimpanan untuk menghasilkan daftar lokasi partisi.

**Topics**
+ [Cara menggunakan `date` tipenya](partition-projection-kinesis-firehose-example-using-the-date-type.md)
+ [Bagaimana memilih tombol partisi](partition-projection-kinesis-firehose-example-choosing-partition-keys.md)
+ [Cara menggunakan awalan khusus dan partisi dinamis](partition-projection-kinesis-firehose-example-using-custom-prefixes-and-dynamic-partitioning.md)

# Cara menggunakan `date` tipenya
<a name="partition-projection-kinesis-firehose-example-using-the-date-type"></a>

Bila Anda menggunakan `date` tipe untuk kunci partisi yang diproyeksikan, Anda harus menentukan rentang. Karena Anda tidak memiliki data untuk tanggal sebelum aliran pengiriman Firehose dibuat, Anda dapat menggunakan tanggal pembuatan sebagai awal. Dan karena Anda tidak memiliki data untuk tanggal di masa depan, Anda dapat menggunakan token khusus `NOW` sebagai akhir.

Dalam `CREATE TABLE` contoh, tanggal mulai ditentukan sebagai 1 Januari 2021 pada tengah malam UTC.

**catatan**  
Konfigurasikan rentang yang cocok dengan data Anda sedekat mungkin sehingga Athena hanya mencari partisi yang ada.

Ketika kueri dijalankan pada tabel sampel, Athena menggunakan kondisi pada tombol `datehour` partisi dalam kombinasi dengan rentang untuk menghasilkan nilai. Pertimbangkan kueri berikut:

```
SELECT *
FROM my_ingested_data
WHERE datehour >= '2020/12/15/00'
AND datehour < '2021/02/03/15'
```

Kondisi pertama dalam `SELECT` kueri menggunakan tanggal yang sebelum dimulainya rentang tanggal yang ditentukan oleh `CREATE TABLE` pernyataan. Karena konfigurasi proyeksi partisi tidak menetapkan partisi untuk tanggal sebelum 1 Januari 2021, Athena mencari data hanya di lokasi berikut, dan mengabaikan tanggal sebelumnya dalam kueri.

```
s3://amzn-s3-demo-bucket/prefix/2021/01/01/00/
s3://amzn-s3-demo-bucket/prefix/2021/01/01/01/
s3://amzn-s3-demo-bucket/prefix/2021/01/01/02/
...
s3://amzn-s3-demo-bucket/prefix/2021/02/03/12/
s3://amzn-s3-demo-bucket/prefix/2021/02/03/13/
s3://amzn-s3-demo-bucket/prefix/2021/02/03/14/
```

Demikian pula, jika kueri berjalan pada tanggal dan waktu sebelum 3 Februari 2021 pukul 15:00, partisi terakhir akan mencerminkan tanggal dan waktu saat ini, bukan tanggal dan waktu dalam kondisi kueri.

Jika Anda ingin menanyakan data terbaru, Anda dapat memanfaatkan fakta bahwa Athena tidak menghasilkan tanggal masa depan dan hanya menentukan awal`datehour`, seperti pada contoh berikut.

```
SELECT *
FROM my_ingested_data
WHERE datehour >= '2021/11/09/00'
```

# Bagaimana memilih tombol partisi
<a name="partition-projection-kinesis-firehose-example-choosing-partition-keys"></a>

Anda dapat menentukan bagaimana proyeksi partisi memetakan lokasi partisi ke kunci partisi. Dalam `CREATE TABLE` contoh di bagian sebelumnya, tanggal dan jam digabungkan menjadi satu kunci partisi yang disebut datehour, tetapi skema lain dimungkinkan. Misalnya, Anda juga dapat mengonfigurasi tabel dengan kunci partisi terpisah untuk tahun, bulan, hari, dan jam. 

Namun, membagi tanggal menjadi tahun, bulan, dan hari berarti bahwa jenis proyeksi `date` partisi tidak dapat digunakan. Alternatifnya adalah memisahkan tanggal dari jam untuk tetap memanfaatkan jenis proyeksi `date` partisi, tetapi membuat kueri yang menentukan rentang jam lebih mudah dibaca.

Dengan mengingat hal itu, `CREATE TABLE` contoh berikut memisahkan tanggal dari jam. Karena `date` adalah kata cadangan dalam SQL, contoh menggunakan `day` sebagai nama untuk kunci partisi yang mewakili tanggal.

```
CREATE EXTERNAL TABLE my_ingested_data2 (
 ...
)
...
PARTITIONED BY (
 day STRING,
 hour INT
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
 "projection.enabled" = "true",
 "projection.day.type" = "date",
 "projection.day.format" = "yyyy/MM/dd",
 "projection.day.range" = "2021/01/01,NOW",
 "projection.day.interval" = "1",
 "projection.day.interval.unit" = "DAYS",
 "projection.hour.type" = "integer",
 "projection.hour.range" = "0,23",
 "projection.hour.digits" = "2",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${day}/${hour}/"
)
```

Dalam `CREATE TABLE` pernyataan contoh, jam adalah kunci partisi terpisah, dikonfigurasi sebagai bilangan bulat. Konfigurasi untuk kunci partisi jam menentukan rentang 0 hingga 23, dan jam harus diformat dengan dua digit saat Athena menghasilkan lokasi partisi.

Kueri untuk `my_ingested_data2` tabel mungkin terlihat seperti ini:

```
SELECT *
FROM my_ingested_data2
WHERE day = '2021/11/09'
AND hour > 3
```

## Memahami kunci partisi dan tipe data proyeksi partisi
<a name="partition-projection-kinesis-firehose-example-partition-key-types-and-partition-projection-types"></a>

Perhatikan bahwa `datehour` kunci dalam `CREATE TABLE` contoh pertama dikonfigurasi seperti `date` pada konfigurasi proyeksi partisi, tetapi jenis kunci partisi adalah`string`. Hal yang sama `day` berlaku untuk contoh kedua. Jenis dalam konfigurasi proyeksi partisi hanya memberi tahu Athena cara memformat nilai saat menghasilkan lokasi partisi. Jenis yang Anda tentukan tidak mengubah jenis kunci partisi — dalam kueri, `datehour` dan `day` bertipe`string`.

Ketika kueri menyertakan kondisi seperti`day = '2021/11/09'`, Athena mem-parsing string di sisi kanan ekspresi menggunakan format tanggal yang ditentukan dalam konfigurasi proyeksi partisi. Setelah Athena memverifikasi bahwa tanggal berada dalam rentang yang dikonfigurasi, ia menggunakan format tanggal lagi untuk memasukkan tanggal sebagai string ke dalam template lokasi penyimpanan.

Demikian pula, untuk kondisi kueri seperti`day > '2021/11/09'`, Athena mem-parsing sisi kanan dan menghasilkan daftar semua tanggal yang cocok dalam rentang yang dikonfigurasi. Kemudian menggunakan format tanggal untuk memasukkan setiap tanggal ke dalam template lokasi penyimpanan untuk membuat daftar lokasi partisi.

Menulis kondisi yang sama dengan `day > '2021-11-09'` atau `day > DATE '2021-11-09'` tidak berfungsi. Dalam kasus pertama, format tanggal tidak cocok (perhatikan tanda hubung alih-alih garis miring ke depan), dan dalam kasus kedua, tipe data tidak cocok.

# Cara menggunakan awalan khusus dan partisi dinamis
<a name="partition-projection-kinesis-firehose-example-using-custom-prefixes-and-dynamic-partitioning"></a>

[Firehose dapat dikonfigurasi dengan [awalan khusus dan partisi dinamis.](https://docs.aws.amazon.com/firehose/latest/dev/s3-prefixes.html)](https://docs.aws.amazon.com/firehose/latest/dev/dynamic-partitioning.html) Dengan menggunakan fitur-fitur ini, Anda dapat mengonfigurasi kunci Amazon S3 dan menyiapkan skema partisi yang mendukung kasus penggunaan Anda dengan lebih baik. Anda juga dapat menggunakan proyeksi partisi dengan skema partisi ini dan mengkonfigurasinya sesuai dengan itu.

Misalnya, Anda dapat menggunakan fitur awalan khusus untuk mendapatkan kunci Amazon S3 yang memiliki tanggal berformat ISO, bukan skema default. `yyyy/MM/dd/HH`

Anda juga dapat menggabungkan awalan kustom dengan partisi dinamis untuk mengekstrak properti seperti dari pesan `customer_id` Firehose, seperti pada contoh berikut.

```
prefix/!{timestamp:yyyy}-!{timestamp:MM}-!{timestamp:dd}/!{partitionKeyFromQuery:customer_id}/
```

Dengan awalan Amazon S3 itu, aliran pengiriman Firehose akan menulis objek ke kunci seperti. `s3://amzn-s3-demo-bucket/prefix/2021-11-01/customer-1234/file.extension` Untuk properti seperti`customer_id`, di mana nilainya mungkin tidak diketahui sebelumnya, Anda dapat menggunakan jenis proyeksi partisi `injected` dan menggunakan `CREATE TABLE` pernyataan seperti berikut:

```
CREATE EXTERNAL TABLE my_ingested_data3 (
 ...
)
...
PARTITIONED BY (
 day STRING,
 customer_id STRING
)
LOCATION "s3://amzn-s3-demo-bucket/prefix/"
TBLPROPERTIES (
 "projection.enabled" = "true",
 "projection.day.type" = "date",
 "projection.day.format" = "yyyy-MM-dd",
 "projection.day.range" = "2021-01-01,NOW",
 "projection.day.interval" = "1",
 "projection.day.interval.unit" = "DAYS",
 "projection.customer_id.type" = "injected",
 "storage.location.template" = "s3://amzn-s3-demo-bucket/prefix/${day}/${customer_id}/"
)
```

Saat Anda menanyakan tabel yang memiliki jenis kunci partisi`injected`, kueri Anda harus menyertakan nilai untuk kunci partisi tersebut. Kueri untuk `my_ingested_data3` tabel mungkin terlihat seperti ini:

```
SELECT *
FROM my_ingested_data3
WHERE day BETWEEN '2021-11-01' AND '2021-11-30'
AND customer_id = 'customer-1234'
```

## Gunakan tipe DATE untuk kunci partisi hari
<a name="partition-projection-kinesis-firehose-example-iso-formatted-dates"></a>

Karena nilai untuk kunci `day` partisi diformat ISO, Anda juga dapat menggunakan `DATE` tipe untuk kunci partisi hari alih-alih`STRING`, seperti pada contoh berikut:

```
PARTITIONED BY (day DATE, customer_id STRING)
```

Saat Anda melakukan kueri, strategi ini memungkinkan Anda untuk menggunakan fungsi tanggal pada kunci partisi tanpa parsing atau casting, seperti pada contoh berikut:

```
SELECT *
FROM my_ingested_data3
WHERE day > CURRENT_DATE - INTERVAL '7' DAY
AND customer_id = 'customer-1234'
```

**catatan**  
Menentukan kunci partisi dari `DATE` jenis mengasumsikan bahwa Anda telah menggunakan fitur [awalan khusus](https://docs.aws.amazon.com/firehose/latest/dev/s3-prefixes.html) untuk membuat kunci Amazon S3 yang memiliki tanggal berformat ISO. Jika Anda menggunakan format Firehose default`yyyy/MM/dd/HH`, Anda harus menentukan kunci partisi sebagai tipe `string` meskipun properti tabel yang sesuai adalah tipe`date`, seperti pada contoh berikut:  

```
PARTITIONED BY ( 
  `mydate` string)
TBLPROPERTIES (
  'projection.enabled'='true', 
   ...
  'projection.mydate.type'='date',
  'storage.location.template'='s3://amzn-s3-demo-bucket/prefix/${mydate}')
```