Creación de una tabla externa en Hive - Amazon DynamoDB

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

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

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.