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 * FROMhiveTableName
;
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 TABLEs3_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 TABLEs3_export
SELECT * FROMhiveTableName
;
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 tablaEXTERNAL
en Amazon S3, puede llamar al comandoINSERT 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 TABLEs3TableName
SELECT * FROMhiveTableName
;
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 TABLElzo_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 TABLElzo_compression_table
SELECT * FROMhiveTableName
;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 yhiveTableName
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 definirdynamodb.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 * FROMhiveTableName
;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 TABLEs3_export
(a_col string, b_col bigint, c_col array<string>
) STORED AS SEQUENCEFILE LOCATION 's3://amzn-s3-demo-bucket/path/subpath/
'; INSERT OVERWRITE TABLEs3_export
SELECT * FROMhiveTableName
;
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 TABLEhiveTableName
(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 TABLEhiveTableName
SELECT * FROMs3_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 tipomap<string, string>
. Si, a continuación, crea una tabla de Hive que está vinculada a DynamoDB, puede llamar al comandoINSERT 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 TABLEhiveTableName
(item map<string,string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1
"); INSERT OVERWRITE TABLEhiveTableName
SELECT * FROMs3TableName
;
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 TABLEhiveTableName
(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 TABLEhiveTableName
SELECT * FROMhdfs_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 TABLEhive_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 TABLECustomer_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.