Ejemplo de comandos de Hive para la exportación, importación y consulta de datos en DynamoDB - Amazon EMR

Ejemplo de comandos de Hive para la exportación, importación y consulta de datos en DynamoDB

Los siguientes ejemplos utilizan comandos de Hive para llevar a cabo operaciones como: exportación de datos a Amazon S3 o HDFS, importación de datos a DynamoDB, unión de tablas, consulta de tablas y mucho más.

Las operaciones en una tabla de Hive hacen referencia los datos almacenados en DynamoDB. Los comandos de Hive están sujetos a la configuración de rendimiento aprovisionado de la tabla de DynamoDB y los datos recuperados incluyen los datos escritos en la tabla de DynamoDB en el momento en que DynamoDB procesa la solicitud de la operación de Hive. Si el proceso de recuperación de datos tarda mucho tiempo, algunos datos devueltos por el comando Hive es posible que se hayan actualizado en DynamoDB desde que se inició el comando de Hive.

Los comandos de Hive DROP TABLE y CREATE TABLE solo actúan sobre la tablas locales en Hive y no crean ni borran tablas en DynamoDB. Si su consulta de Hive hace referencia a una tabla en DynamoDB, la tabla ya existe antes de ejecutar la consulta. Para obtener más información sobre la creación y eliminación de tablas en DynamoDB, consulte, Uso de tablas en DynamoDB en la Guía para desarrolladores de Amazon DynamoDB.

nota

Al mapear una tabla de Hive a una ubicación de Amazon S3, no la mapee a la ruta raíz del bucket, s3://amzn-s3-demo-bucket, ya que esto puede provocar errores cuando Hive escriba los datos en Amazon S3. En lugar de ello asigne la tabla a una subruta del bucket, s3://amzn-s3-demo-bucket/mypath.

Exportación de datos desde DynamoDB

Puede utilizar Hive para exportar datos desde DynamoDB.

Para exportar una tabla de DynamoDB a un bucket de Amazon S3
  • Cree una tabla de Hive que haga referencia a los datos almacenados en DynamoDB. A continuación, puede llamar al comando INSERT OVERWRITE para escribir los datos en un directorio externo. En el ejemplo siguiente, s3://amzn-s3-demo-bucket/path/subpath/ es una ruta válida de Amazon S3. Ajuste las columnas y tipos de datos en el comando CREATE para asignar los valores en su DynamoDB. Puede utilizar esto para crear un archivo de los datos de DynamoDB en Amazon S3.

    CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); INSERT OVERWRITE DIRECTORY 's3://amzn-s3-demo-bucket/path/subpath/' SELECT * FROM hiveTableName;
Para exportar una tabla de DynamoDB a un bucket de Amazon S3 utilizando del formato
  • Cree una tabla externa que haga referencia a una ubicación en Amazon S3. Esto se muestra a continuación como s3_export. Durante la llamada CREATE, especifique el formato de fila para la tabla. A continuación, cuando utilice INSERT OVERWRITE para exportar datos desde DynamoDB a s3_export, los datos se escriben en el formato especificado. En el siguiente ejemplo, los datos se escriben como valores separados por comas (CSV).

    CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); CREATE EXTERNAL TABLE s3_export(a_col string, b_col bigint, c_col array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://amzn-s3-demo-bucket/path/subpath/'; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;
Para exportar una tabla de DynamoDB a un bucket de Amazon S3 sin especificar un mapeo de columnas
  • Cree una tabla de Hive que haga referencia a los datos almacenados en DynamoDB. Esto es similar al ejemplo anterior, salvo que no tiene que especificar un mapeo de columnas. En la tabla debe tener exactamente una columna de tipo map<string, string>. Si crea una tabla EXTERNAL en Amazon S3, puede llamar al comando INSERT OVERWRITE para escribir los datos de DynamoDB en Amazon S3. Puede utilizar esto para crear un archivo de los datos de DynamoDB en Amazon S3. Dado que no hay ningún mapeo de columnas, no puede consultar las tablas que se hayan exportado de esta manera. La exportación de datos sin especificar un mapeo de columna está disponible en Hive 0.8.1.5 o versiones posteriores, que es compatible con la AMI 2.2.x y posteriores de Amazon EMR.

    CREATE EXTERNAL TABLE hiveTableName (item map<string,string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1"); CREATE EXTERNAL TABLE s3TableName (item map<string, string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://amzn-s3-demo-bucket/path/subpath/'; INSERT OVERWRITE TABLE s3TableName SELECT * FROM hiveTableName;
Para exportar una tabla de DynamoDB a un bucket de Amazon S3 utilizando la compresión de datos
  • Hive proporciona varios códecs de compresión que puede definir durante la sesión de Hive. Al hacerlo los datos exportados se comprimen en el formato especificado. El siguiente ejemplo comprime los archivos exportados utilizando el algoritmo Lempel-Ziv-Oberhumer (LZO).

    SET hive.exec.compress.output=true; SET io.seqfile.compression.type=BLOCK; SET mapred.output.compression.codec = com.hadoop.compression.lzo.LzopCodec; CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); CREATE EXTERNAL TABLE lzo_compression_table (line STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://amzn-s3-demo-bucket/path/subpath/'; INSERT OVERWRITE TABLE lzo_compression_table SELECT * FROM hiveTableName;

    Los códecs de compresión disponibles son:

    • org.apache.hadoop.io.compress.GzipCodec

    • org.apache.hadoop.io.compress.DefaultCodec

    • com.hadoop.compression.lzo.LzoCodec

    • com.hadoop.compression.lzo.LzopCodec

    • org.apache.hadoop.io.compress.BZip2Codec

    • org.apache.hadoop.io.compress.SnappyCodec

Para exportar una tabla de DynamoDB a HDFS
  • Utilice el siguiente comando de Hive, donde hdfs:///directoryName es una ruta de HDFS válida y hiveTableName es una tabla de Hive que hace referencia a DynamoDB. Esta operación de exportación es más rápida que la exportación de una tabla de DynamoDB a Amazon S3 debido a que Hive 0.7.1.1 utiliza HDFS como paso intermedio al exportar datos a Amazon S3. El siguiente ejemplo muestra también cómo definir dynamodb.throughput.read.percent en 1,0 para aumentar la tasa de solicitud de lectura.

    CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); SET dynamodb.throughput.read.percent=1.0; INSERT OVERWRITE DIRECTORY 'hdfs:///directoryName' SELECT * FROM hiveTableName;

    También puede exportar datos a HDFS mediante el formato y la compresión que se muestran más arriba para la exportación a Amazon S3. Para hacerlo, solo tiene que sustituir el directorio de Amazon S3 en los ejemplos anteriores por un directorio HDFS.

Para leer datos de caracteres UTF-8 no imprimibles en Hive
  • Puede leer y escribir datos de caracteres UTF-8 no imprimibles con Hive utilizando la cláusula STORED AS SEQUENCEFILE al crear la tabla. Un SequenceFile es un formato de archivo binario de Hadoop; tiene que usar Hadoop para leer este archivo. En el siguiente ejemplo se muestra cómo exportar datos desde DynamoDB a Amazon S3. Puede utilizar esta funcionalidad para controlar caracteres codificados con UTF-8 no imprimibles.

    CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); CREATE EXTERNAL TABLE s3_export(a_col string, b_col bigint, c_col array<string>) STORED AS SEQUENCEFILE LOCATION 's3://amzn-s3-demo-bucket/path/subpath/'; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;

Importación de datos a DynamoDB

Al escribir datos en DynamoDB utilizando Hive, debe asegurarse de que el número de unidades de capacidad de escritura sea mayor que el número de asignadores en el clúster. Por ejemplo, los clústeres que se ejecutan en instancias EC2 m1.xlarge producen 8 asignadores por instancia. En el caso de un clúster; que tiene 10 instancias, eso supondría un total de 80 asignadores. Si sus unidades de capacidad de escritura no son mayores que el número de asignadores en el clúster, la operación de escritura de Hive puede consumir todo el rendimiento de escritura o intentar consumir más rendimiento del aprovisionado. Para obtener más información sobre el número de mapeadores creado por cada tipo de instancia EC2, consulte Configurar Hadoop.

El número de mapeadores de Hadoop se controla mediante las divisiones de entrada. Si hay muy pocas divisiones, el comando de escritura podría no ser capaz de consumir todo el rendimiento de escritura disponible.

Si existe un elemento con la misma clave en la tabla de DynamoDB de destino, se sobrescribe. Si no existe ningún elemento con la clave en la tabla de DynamoDB de destino, el elemento se inserta.

Para importar datos de Amazon S3 a DynamoDB
  • Puede usar Amazon EMR (Amazon EMR) y Hive para escribir datos de Amazon S3 en DynamoDB.

    CREATE EXTERNAL TABLE s3_import(a_col string, b_col bigint, c_col array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://amzn-s3-demo-bucket/path/subpath/'; CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); INSERT OVERWRITE TABLE hiveTableName SELECT * FROM s3_import;
Para importar una tabla desde un bucket de Amazon S3 a DynamoDB sin especificar un mapeo de columnas
  • Cree una tabla EXTERNAL que haga referencia a los datos almacenados en Amazon S3 que se exportaron previamente desde DynamoDB. Antes de la importación, asegúrese de que la tabla existe en DynamoDB y que tiene el mismo esquema de claves que la tabla de DynamoDB exportada anteriormente. Además, la tabla debe tener exactamente una columna de tipo map<string, string>. Si, a continuación, crea una tabla de Hive que está vinculada a DynamoDB, puede llamar al comando INSERT OVERWRITE para escribir los datos de Amazon S3 en DynamoDB. Dado que no hay ningún mapeo de columnas, no puede consultar las tablas que se hayan importado de esta manera. La importación de datos sin especificar un mapeo de columna está disponible en Hive 0.8.1.5 o versiones posteriores, que es compatible con la AMI 2.2.3 y posteriores de Amazon EMR.

    CREATE EXTERNAL TABLE s3TableName (item map<string, string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://amzn-s3-demo-bucket/path/subpath/'; CREATE EXTERNAL TABLE hiveTableName (item map<string,string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1"); INSERT OVERWRITE TABLE hiveTableName SELECT * FROM s3TableName;
Para importar una tabla desde HDFS a DynamoDB
  • Puede utilizar Amazon EMR y Hive para escribir datos de HDFS en DynamoDB.

    CREATE EXTERNAL TABLE hdfs_import(a_col string, b_col bigint, c_col array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 'hdfs:///directoryName'; CREATE EXTERNAL TABLE hiveTableName (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays"); INSERT OVERWRITE TABLE hiveTableName SELECT * FROM hdfs_import;

Consulta de datos en DynamoDB

Los siguientes ejemplos muestran las distintas formas en las que puede utilizar Amazon EMR para consultar los datos almacenados en DynamoDB.

Para encontrar el mayor valor para una columna mapeada (max)
  • Utilice los comandos de Hive como los siguientes. En el primer comando, la instrucción CREATE crea una tabla de Hive que hace referencia a los datos almacenados en DynamoDB. La instrucción SELECT utiliza a continuación dicha tabla para consultar los datos almacenados en DynamoDB. El siguiente ejemplo encuentra el mayor pedido realizado por un determinado cliente.

    CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Purchases", "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items"); SELECT max(total_cost) from hive_purchases where customerId = 717;
Para agregar datos utilizando la cláusula GROUP BY
  • Puede utilizar la cláusula GROUP BY para recopilar datos a través de varios registros. Esto se utiliza a menudo con una función de agregación, como suma, recuento, mín o máx. En el siguiente ejemplo, se devuelve una lista de los mayores pedidos de clientes que han realizado más de tres pedidos.

    CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Purchases", "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items"); SELECT customerId, max(total_cost) from hive_purchases GROUP BY customerId HAVING count(*) > 3;
Para unir dos tablas de DynamoDB
  • El siguiente ejemplo asocia dos tablas de Hive a los datos almacenados en DynamoDB. A continuación, hace una llamada para unir estas dos tablas. La unión se calcula en el clúster y se devuelve. La unión no tiene lugar en DynamoDB. Este ejemplo devuelve una lista de los clientes y de sus compras para clientes que han realizado más de dos pedidos.

    CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Purchases", "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items"); CREATE EXTERNAL TABLE hive_customers(customerId bigint, customerName string, customerAddress array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Customers", "dynamodb.column.mapping" = "customerId:CustomerId,customerName:Name,customerAddress:Address"); Select c.customerId, c.customerName, count(*) as count from hive_customers c JOIN hive_purchases p ON c.customerId=p.customerId GROUP BY c.customerId, c.customerName HAVING count > 2;
Para unir dos tablas desde orígenes diferentes
  • En el siguiente ejemplo, Customer_S3 es una tabla de Hive que carga un archivo CSV almacenado en Amazon S3 y hive_purchases es una tabla que hace referencia a datos de DynamoDB. El siguiente ejemplo une datos de clientes almacenados en un archivo CSV en Amazon S3 con datos de pedidos almacenados en DynamoDB para devolver un conjunto de datos que representa los pedidos realizados por los clientes que tienen "Miller" en su nombre.

    CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Purchases", "dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items"); CREATE EXTERNAL TABLE Customer_S3(customerId bigint, customerName string, customerAddress array<String>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://amzn-s3-demo-bucket/path/subpath/'; Select c.customerId, c.customerName, c.customerAddress from Customer_S3 c JOIN hive_purchases p ON c.customerid=p.customerid where c.customerName like '%Miller%';
nota

En los ejemplos anteriores, se incluyeron las instrucciones CREATE TABLE en cada ejemplo para mayor claridad e integridad. Al ejecutar varias consultas o exportar operaciones en una tabla de Hive determinada, solo tiene que crear la tabla una vez, al principio de la sesión de Hive.