

# Creación de una tabla externa en Hive
<a name="EMRforDynamoDB.ExternalTableForDDB"></a>

En [Tutorial: Uso de Amazon DynamoDB y Apache Hive](EMRforDynamoDB.Tutorial.md), hemos creado una tabla de Hive externa que mapea a una tabla de DynamoDB. Cada vez que emitía instrucciones de HiveQL para la tabla externa, las operaciones de lectura y escritura se transmitían a la tabla de DynamoDB.

Podemos considerar que una tabla externa es un puntero que señala a un origen de datos administrado y almacenado en otro lugar. En este caso, el origen de datos subyacente es una tabla de DynamoDB. (La tabla debe existir previamente. No se puede crear, actualizar ni eliminar una tabla de DynamoDB desde Hive). Utilice la instrucción `CREATE EXTERNAL TABLE` para crear la tabla externa. A partir de ese momento, podrá usar HiveQL para trabajar con los datos de DynamoDB, como si se encontrasen almacenado localmente en Hive.

**nota**  
Puede usar instrucciones `INSERT` para insertar datos en una tabla externa e instrucciones `SELECT` para seleccionar datos en ella. Sin embargo, no se pueden usar instrucciones `UPDATE` ni `DELETE` para manipular los datos de la tabla.

Cuando ya no necesite la tabla externa, puede eliminarla mediante la instrucción `DROP TABLE`. En este caso, `DROP TABLE` solamente elimina la tabla externa en Hive. La operación no afecta a la tabla de DynamoDB subyacente ni a ninguno de los datos que contiene.

**Topics**
+ [Sintaxis de CREATE EXTERNAL TABLE](#EMRforDynamoDB.ExternalTableForDDB.Syntax)
+ [Mapeos de tipos de datos](#EMRforDynamoDB.ExternalTableForDDB.DataTypes)

## Sintaxis de CREATE EXTERNAL TABLE
<a name="EMRforDynamoDB.ExternalTableForDDB.Syntax"></a>

A continuación se muestra la sintaxis de HiveQL para crear una tabla de Hive externa que mapea a una tabla de 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..."
);
```

La línea 1 es el principio de la instrucción `CREATE EXTERNAL TABLE`, en la que se indica el nombre de la tabla de Hive (*hive\$1table*) que se desea a crear.

La línea 2 especifica las columnas y los tipos de datos de *hive\$1table*. Debe definir las columnas y los tipos de datos que se correspondan con los atributos de la tabla de DynamoDB. 

La línea 3 es la cláusula `STORED BY`, en la que se especifica una clase que controla la administración de los datos entre Hive y la tabla de DynamoDB. Para DynamoDB, `STORED BY` debe definirse en `'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'`. 

La línea 4 es el principio de la cláusula `TBLPROPERTIES`, en la que se definen los parámetros siguientes de `DynamoDBStorageHandler`: 
+ `dynamodb.table.name`: el nombre de la tabla de DynamoDB.
+  `dynamodb.column.mapping`: pares de los nombres de las columnas de la tabla de Hive y sus atributos correspondientes en la tabla de DynamoDB. Cada par tiene el formato *nombre\$1de\$1columna\$1de\$1hive:nombre\$1de\$1atributo\$1de\$1dynamodb* y los pares están separados entre sí por comas.

Tenga en cuenta lo siguiente:
+ El nombre de la tabla de Hive no tiene que ser igual que el de la tabla de DynamoDB.
+ Los nombres de las columnas de la tabla de Hive no tienen que ser iguales que los de la tabla de DynamoDB.
+ La tabla especificada en `dynamodb.table.name` debe existir previamente en DynamoDB.
+ Para `dynamodb.column.mapping`:
  + Debe mapear los atributos del esquema de claves de la tabla de DynamoDB. Esto incluye la clave de partición y la clave de ordenación (si la hay).
  + No tiene que mapear los atributos que no son clave de la tabla de DynamoDB. Sin embargo, no aparecerá ningún dato de esos atributos cuando consulte la tabla de Hive.
  + Si los tipos de datos de una columna de la tabla de Hive y de un atributo de DynamoDB son incompatibles, aparecerá `NULL` en esas columnas cuando consulte la tabla de Hive.

**nota**  
La instrucción `CREATE EXTERNAL TABLE` no lleva a cabo ninguna validación relativa a la cláusula `TBLPROPERTIES`. Los valores que proporcione para `dynamodb.table.name` y `dynamodb.column.mapping` solamente serán evaluados por la clase `DynamoDBStorageHandler` cuando se intente obtener acceso a la tabla.

## Mapeos de tipos de datos
<a name="EMRforDynamoDB.ExternalTableForDDB.DataTypes"></a>

En la tabla siguiente se muestran los tipos de datos de DynamoDB y aquellos de Hive que son compatibles:


****  

| Tipo de dato de DynamoDB | Tipo de datos de Hive | 
| --- | --- | 
|  Cadena  |  `STRING`  | 
|  Número  |  `BIGINT` o `DOUBLE`  | 
|  Binario  |  `BINARY`  | 
|  String Set  |  `ARRAY<STRING>`  | 
|  Number Set  |  `ARRAY<BIGINT>` o `ARRAY<DOUBLE>`  | 
|  Binary Set  |  `ARRAY<BINARY>`  | 

**nota**  
La clase `DynamoDBStorageHandler` no admite los siguientes tipos de datos de DynamoDB, por lo que estos no se pueden utilizar con `dynamodb.column.mapping`:  
Asignación
Enumeración
Booleano
Nulo
No obstante, si necesita trabajar con estos tipos de datos, puede crear una única entidad llamada `item` que represente todo el elemento de DynamoDB como un mapa de cadenas tanto para las claves como para los valores del mapa. Para obtener más información, consulte [Copia de datos sin mapeo de columnas](EMRforDynamoDB.CopyingData.S3.md#EMRforDynamoDB.CopyingData.S3.NoColumnMapping)

Si desea mapear un atributo de DynamoDB del tipo Number (número), debe elegir un tipo de Hive apropiado:
+ El tipo `BIGINT` de Hive es para enteros de 8 bytes con signo. Es igual que el tipo de datos `long` de Java.
+ El tipo `DOUBLE` de Hive es para números de 8 bits con coma flotante de doble precisión. Es igual que el tipo `double` de Java.

Si tiene datos numéricos almacenados en DynamoDB cuya precisión es superior a la del tipo de datos de Hive que ha elegido, al obtener acceso a los datos de DynamoDB podría perderse precisión. 

Si exporta datos del tipo Binary (binario) de DynamoDB a (Amazon S3) o HDFS, los datos se almacenarán como una cadena codificada en Base64. Si importa datos de Amazon S3 o HDFS al tipo Binary (binario) de DynamoDB, debe asegurarse de que estén codificados como una cadena Base64.