Creación de una tabla externa en Hive
En Tutorial: Uso de Amazon DynamoDB y Apache Hive, 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.
Sintaxis de CREATE EXTERNAL TABLE
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_table) que se desea a crear.
La línea 2 especifica las columnas y los tipos de datos de hive_table. 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_de_columna_de_hive:nombre_de_atributo_de_dynamodb 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. -
En
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
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 |
|
Número |
|
Binario |
|
String Set |
|
Number Set |
|
Binary Set |
|
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
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 datoslong
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 tipodouble
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.