

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

# 在 Hive 中建立外部資料表
<a name="EMRforDynamoDB.ExternalTableForDDB"></a>

在 [教學課程：使用 Amazon DynamoDB 和 Apache Hive](EMRforDynamoDB.Tutorial.md) 中，您已建立映射到 DynamoDB 資料表的外部 Hive 資料表。在針對外部資料表發出 HiveQL 陳述式時，讀取和寫入操作會傳遞到 DynamoDB 資料表。

您可以將外部資料表視為指向在別處管理和存放的資料來源的指標。在此情況下，基礎資料來源即為 DynamoDB 資料表。(資料表必須已存在。您無法從 Hive 內建立、更新或刪除 DynamoDB 資料表。) 您可以使用 `CREATE EXTERNAL TABLE` 陳述式建立外部資料表。之後，您可以使用 HiveQL 來處理 DynamoDB 中的資料，就好像資料本機存放在 Hive 中一樣。

**注意**  
您可以使用 `INSERT` 陳述式將資料插入到外部資料表中，並使用 `SELECT` 陳述式從中選取資料。不過，您無法使用 `UPDATE` 或 `DELETE` 陳述式來運用資料表中的資料。

如果不再需要外部資料表，您可以使用 `DROP TABLE` 陳述式將其移除。在本案例中，`DROP TABLE` 僅移除 Hive 中的外部資料表。它不會影響基礎 DynamoDB 資料表或其中的任何資料。

**Topics**
+ [建立外部資料表語法](#EMRforDynamoDB.ExternalTableForDDB.Syntax)
+ [資料類型映射](#EMRforDynamoDB.ExternalTableForDDB.DataTypes)

## 建立外部資料表語法
<a name="EMRforDynamoDB.ExternalTableForDDB.Syntax"></a>

以下內容顯示用於建立映射到 DynamoDB 資料表的外部 Hive 資料表的 HiveQL 語法：

```
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..."
);
```

第 1 列為 `CREATE EXTERNAL TABLE` 陳述式的開始，可讓您在其中提供要建立的 Hive 資料表 (*hive\$1table*)。

第 2 列指定 *hive\$1table* 的資料欄和資料類型。您需要定義與 DynamoDB 資料表中屬性對應的資料欄和資料類型。

第 3 列是 `STORED BY` 子句，可讓您在其中指定類別來處理 Hive 和 DynamoDB 資料表之間的資料管理。針對 DynamoDB，`STORED BY` 應設定為 `'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'`。

第 4 列為 `TBLPROPERTIES` 子句的開始，可讓您在其中為 `DynamoDBStorageHandler` 定義下列參數：
+ `dynamodb.table.name`：DynamoDB 資料表的名稱。
+  `dynamodb.column.mapping`：Hive 資料表中資料欄名稱的配對，以及其在 DynamoDB 資料表中的對應屬性。每個配對形式為 *hive\$1column\$1name:dynamodb\$1attribute\$1name*，且配對以逗號分隔。

注意下列事項：
+ Hive 資料表名稱的名稱不一定要與 DynamoDB 資料表名稱相同。
+ Hive 資料表資料欄名稱不一定要與 DynamoDB 資料表中的名稱相同。
+ 由 `dynamodb.table.name` 指定的資料表必須存在於 DynamoDB 中。
+ 在 `dynamodb.column.mapping` 中：
  + 您必須映射 DynamoDB 資料表的金鑰結構描述屬性。這包含分割區索引鍵和排序索引鍵 (若有)。
  + 您不需要映射 DynamoDB 資料表的非索引鍵屬性。不過，在查詢 Hive 資料表時，您不會看到這些屬性的任何資料。
  + 如果 Hive 資料表資料欄的資料類型與 DynamoDB 屬性的資料類型不相容，在查詢 Hive 資料表時，您會在這些資料欄中看到 `NULL`。

**注意**  
此 `CREATE EXTERNAL TABLE` 陳述式不會對 `TBLPROPERTIES` 子句執行任何驗證。您為 `dynamodb.table.name` 和 `dynamodb.column.mapping` 提供的值僅在您嘗試存取資料表時由 `DynamoDBStorageHandler` 類別評估。

## 資料類型映射
<a name="EMRforDynamoDB.ExternalTableForDDB.DataTypes"></a>

以下資料表顯示 DynamoDB 資料類型和相容的 Hive 資料類型：


****  

| DynamoDB 資料類型 | Hive 資料類型 | 
| --- | --- | 
|  String  |  `STRING`  | 
|  數字  |  `BIGINT` 或 `DOUBLE`  | 
|  二進位  |  `BINARY`  | 
|  String Set  |  `ARRAY<STRING>`  | 
|  Number Set  |  `ARRAY<BIGINT>` 或 `ARRAY<DOUBLE>`  | 
|  Binary Set  |  `ARRAY<BINARY>`  | 

**注意**  
下列 DynamoDB 資料類型不受 `DynamoDBStorageHandler` 類別支援，因此無法與 `dynamodb.column.mapping` 搭配使用：  
Map
清單
Boolean
Null
但是，如果您需要使用這些資料類型，則可以建立名為 `item` 的單一實體來代表整個 DynamoDB 項目，做為對應中索引鍵和值的字串對應。如需詳細資訊，請參閱[在無資料欄映射的情況下複製資料](EMRforDynamoDB.CopyingData.S3.md#EMRforDynamoDB.CopyingData.S3.NoColumnMapping)

如果要映射 Number 類型的 DynamoDB 屬性，則必須選擇適當的 Hive 類型：
+ Hive `BIGINT` 類型用於 8 位元組帶正負號的整數。該類型與 Java 中的 `long` 資料類型相同。
+ Hive `DOUBLE` 類型用於 8 位元雙精度浮點數。該類型與 Java 中的 `double` 類型相同。

如果 DynamoDB 中儲存的數值資料精確度高於您選擇的 Hive 資料類型，則存取 DynamoDB 資料可能會導致精確度損失。

如果您將 Binary 類型的資料從 DynamoDB 匯出到 (Amazon S3) 或 HDFS，則資料會以 Base64-encoded 的字串存放。如果您將資料以 Binary 類型從 Amazon S3 或 HDFS 匯入 DynamoDB，則必須確保資料已編碼為 Base64 字串。