

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

# Membuat tabel eksternal di Hive
<a name="EMRforDynamoDB.ExternalTableForDDB"></a>

Di [Tutorial: Menggunakan Amazon DynamoDB dan Apache Hive](EMRforDynamoDB.Tutorial.md), Anda membuat tabel Hive eksternal yang dipetakan ke tabel DynamoDB. Ketika Anda mengeluarkan pernyataan HiveQL terhadap tabel eksternal, operasi baca dan tulis diteruskan ke tabel DynamoDB.

Anda dapat mempertimbangkan tabel eksternal sebagai pengarah ke sumber data yang dikelola dan disimpan di tempat lain. Dalam hal ini, sumber data yang mendasarinya adalah tabel DynamoDB. (Tabel harus sudah ada. Anda tidak dapat membuat, memperbarui, atau menghapus tabel DynamoDB dari dalam Hive.) Anda menggunakan pernyataan `CREATE EXTERNAL TABLE` untuk membuat tabel eksternal. Setelah itu, Anda dapat menggunakan HiveQL untuk menggunakan data di DynamoDB, seolah-olah data disimpan secara lokal di dalam Hive.

**catatan**  
Anda dapat menggunakan pernyataan `INSERT` untuk memasukkan data ke dalam tabel eksternal dan pernyataan `SELECT` untuk memilih data dari tabel eksternal. Namun, Anda tidak dapat menggunakan pernyataan `UPDATE` atau `DELETE` untuk memanipulasi data dalam tabel tersebut.

Jika tidak membutuhkan tabel eksternal lagi, Anda dapat menghapusnya menggunakan pernyataan `DROP TABLE`. Dalam kasus ini, `DROP TABLE` hanya menghapus tabel eksternal di Hive. Tabel DynamoDB yang mendasarinya atau datanya tidak akan terpengaruh.

**Topics**
+ [MEMBUAT sintaks TABEL EKSTERNAL](#EMRforDynamoDB.ExternalTableForDDB.Syntax)
+ [Pemetaan jenis data](#EMRforDynamoDB.ExternalTableForDDB.DataTypes)

## MEMBUAT sintaks TABEL EKSTERNAL
<a name="EMRforDynamoDB.ExternalTableForDDB.Syntax"></a>

Berikut ini menunjukkan sintaks HiveQL untuk membuat tabel Hive eksternal yang dipetakan ke tabel DynamoDB:

```
CREATE EXTERNAL TABLE hive_table
    (hive_column1_name hive_column1_datatype, hive_column2_name hive_column2_datatype...)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES (
    "dynamodb.table.name" = "dynamodb_table",
    "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name..."
);
```

Baris 1 adalah awal dari pernyataan `CREATE EXTERNAL TABLE`, Anda menyediakan nama untuk tabel Hive (*hive\$1table*) yang ingin Anda buat.

Baris 2 menentukan kolom dan jenis data untuk *hive\$1table*. Anda perlu menentukan kolom dan jenis data yang sesuai dengan atribut di tabel DynamoDB. 

Baris 3 adalah klausul `STORED BY`, Anda menentukan kelas yang menangani manajemen data antara Hive dan tabel DynamoDB. Untuk DynamoDB, `STORED BY` harus diatur ke `'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'`. 

Baris 4 adalah awal dari klausul `TBLPROPERTIES`, Anda menentukan parameter berikut untuk `DynamoDBStorageHandler`: 
+ `dynamodb.table.name`—nama tabel DynamoDB.
+  `dynamodb.column.mapping`—pasang nama kolom di tabel Hive dan atributnya yang sesuai di tabel DynamoDB. Setiap pasangan memiliki format *hive\$1column\$1name:dynamodb\$1attribute\$1name*, dan pasangan dipisahkan dengan koma.

Perhatikan hal-hal berikut:
+ Nama tabel Hive tidak harus sama dengan nama tabel DynamoDB.
+ Nama kolom tabel Hive tidak harus sama dengan nama kolom di tabel DynamoDB.
+ Tabel yang ditentukan oleh `dynamodb.table.name` harus ada di DynamoDB.
+ Untuk `dynamodb.column.mapping`:
  + Anda harus memetakan atribut skema kunci untuk tabel DynamoDB. Ini termasuk kunci partisi dan kunci urutan (jika ada).
  + Anda tidak harus memetakan atribut non-kunci tabel DynamoDB. Namun, Anda tidak akan melihat data apa pun dari atribut tersebut saat Anda mengkueri tabel Hive.
  + Jika jenis data dari kolom tabel Hive dan atribut DynamoDB tidak kompatibel, Anda akan melihat `NULL` dalam kolom tersebut saat Anda mengkueri tabel Hive.

**catatan**  
Pernyataan `CREATE EXTERNAL TABLE` tidak melakukan validasi apa pun pada klausul `TBLPROPERTIES`. Nilai-nilai yang Anda berikan untuk `dynamodb.table.name` dan `dynamodb.column.mapping` hanya dievaluasi oleh kelas `DynamoDBStorageHandler` Anda mencoba mengakses tabel.

## Pemetaan jenis data
<a name="EMRforDynamoDB.ExternalTableForDDB.DataTypes"></a>

Tabel berikut menunjukkan jenis data DynamoDB dan jenis data Hive yang kompatibel:


****  

| Jenis Data DynamoDB | Jenis Data Hive | 
| --- | --- | 
|  String  |  `STRING`  | 
|  Angka  |  `BIGINT` atau `DOUBLE`  | 
|  Biner  |  `BINARY`  | 
|  Set String  |  `ARRAY<STRING>`  | 
|  Set Angka  |  `ARRAY<BIGINT>` atau `ARRAY<DOUBLE>`  | 
|  Set Biner  |  `ARRAY<BINARY>`  | 

**catatan**  
Jenis data DynamoDB berikut tidak didukung oleh kelas `DynamoDBStorageHandler`, sehingga tidak dapat digunakan dengan `dynamodb.column.mapping`:  
Peta
Daftar
Boolean
Null
Namun, jika perlu menggunakan jenis data ini, Anda dapat membuat satu entitas yang disebut `item` yang mewakili seluruh item DynamoDB sebagai peta string untuk kunci dan nilai di peta. Untuk informasi selengkapnya, lihat [Menyalin data tanpa pemetaan kolom](EMRforDynamoDB.CopyingData.S3.md#EMRforDynamoDB.CopyingData.S3.NoColumnMapping)

Jika ingin memetakan atribut DynamoDB jenis Angka, Anda harus memilih jenis Hive yang sesuai:
+ Jenis `BIGINT` Hive adalah untuk angka bulat bertanda 8-byte. Itu sama dengan jenis data `long` di Java.
+ Jenis `DOUBLE` Hive adalah untuk angka floating-point presisi ganda 8-bit. Itu sama dengan jenis `double` di Java.

Jika Anda memiliki data numerik yang disimpan di DynamoDB yang memiliki presisi lebih tinggi dibandingkan jenis data Hive yang Anda pilih, maka mengakses data DynamoDB dapat menyebabkan hilangnya presisi. 

Jika Anda mengekspor data jenis Biner dari DynamoDB ke (Amazon S3) atau HDFS, data disimpan sebagai string yang dienkode Base64. Jika mengimpor data dari Amazon S3 atau HDFS ke jenis Biner DynamoDB, Anda harus memastikan data dienkode sebagai string Base64.