Exemplos de comandos do Hive para exportar, importar e consultar dados no DynamoDB
Os exemplos a seguir usam comandos do Hive para realizar operações, como exportar dados para o Amazon S3 ou HDFS, importar dados para o DynamoDB, unir tabelas, consultar tabelas e muito mais.
As operações em uma tabela do Hive referenciam dados armazenados no DynamoDB. Os comandos do Hive estão sujeitos às configurações de throughput provisionado da tabela do DynamoDB, e os dados recuperados incluem os dados gravados na tabela do DynamoDB na ocasião em que a solicitação de operação do Hive é processada pelo DynamoDB. Se o processo de recuperação de dados demorar muito, alguns dados retornados pelo comando do Hive podem ter sido atualizados no DynamoDB desde que o comando do Hive foi iniciado.
Os comandos do Hive DROP TABLE
e CREATE TABLE
atuam apenas nas tabelas locais do Hive e não criam nem descartam tabelas no DynamoDB. Se a sua consulta do Hive fizer referência a uma tabela no DynamoDB, essa tabela já deverá existir antes da execução da consulta. Para obter mais informações sobre como criar e excluir tabelas no Amazon DynamoDB, consulte Working with tables in DynamoDB no Guia do desenvolvedor do Amazon DynamoDB.
nota
Quando você mapear uma tabela do Hive para um local no Amazon S3, não a mapeie para o caminho raiz do bucket, s3://amzn-s3-demo-bucket, pois isso poderá causar erros quando o Hive gravar os dados no Amazon S3. Em vez disso, mapeie a tabela para um subcaminho do bucket, s3://amzn-s3-demo-bucket/mypath.
Exportar dados do DynamoDB
Você pode usar o Hive para exportar dados do DynamoDB.
Exportar uma tabela do DynamoDB para um bucket do Amazon S3
-
Crie uma tabela do Hive que faça referência aos dados armazenados no DynamoDB. Em seguida, você poderá chamar o comando INSERT OVERWRITE para gravar os dados em um diretório externo. No exemplo a seguir,
s3://amzn-s3-demo-bucket/path/subpath/
é um caminho válido no Amazon S3. Ajuste as colunas e os tipos de dados no comando CREATE para que eles correspondam aos valores no DynamoDB. Você pode usar isso para criar um arquivamento dos seus dados do DynamoDB no 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
;
Exportar uma tabela do DynamoDB para um bucket do Amazon S3 usando formatação
-
Crie uma tabela externa que referencie um local no Amazon S3. Isso é mostrado abaixo como s3_export. Durante a chamada CREATE, especifique a formatação de linhas para a tabela. Em seguida, quando você usar INSERT OVERWRITE para exportar dados do DynamoDB para o s3_export, os dados serão gravados no formato especificado. No exemplo a seguir, os dados são gravados como valores separados por vírgula (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
;
Exportar uma tabela do DynamoDB para um bucket do Amazon S3 sem especificar um mapeamento de colunas
-
Crie uma tabela do Hive que faça referência aos dados armazenados no DynamoDB. Isso é semelhante ao exemplo anterior, com a diferença de que você não está especificando um mapeamento de colunas. A tabela deve ter exatamente uma coluna do tipo
map<string, string>
. Se você criar uma tabelaEXTERNAL
no Amazon S3, poderá chamar o comandoINSERT OVERWRITE
para gravar os dados do DynamoDB para o Amazon S3. Você pode usar isso para criar um arquivamento dos seus dados do DynamoDB no Amazon S3. Como não há mapeamento de colunas, você não pode consultar tabelas exportadas dessa maneira. A exportação de dados sem especificar um mapeamento de coluna está disponível no Hive 0.8.1.5 ou versões posteriores, que tem suporte na AMI 2.2.x e posteriores do 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
;
Exportar uma tabela do DynamoDB para um bucket do Amazon S3 usando a compactação de dados
-
O Hive oferece vários codecs de codec, que você pode definir durante a sua sessão do Hive. Isso faz com que os dados exportados sejam compactados no formato especificado. O exemplo a seguir compacta os arquivos exportados usando o algoritmo Lempel-Ziv-Oberhumer (LZO) algorithm.
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
;Os codecs de compactação disponíveis são:
-
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
-
Exportar uma tabela do DynamoDB para HDFS
-
Use o seguinte comando do Hive, em que
hdfs:///directoryName
é um caminho do HDFS válido ehiveTableName
é uma tabela no Hive que referencia o DynamoDB. Essa operação de exportação é mais rápida do que exportar uma tabela do DynamoDB para o Amazon S3, pois o Hive 0.7.1.1 usa o HDFS como uma etapa intermediária ao exportar dados para o Amazon S3. O exemplo a seguir também mostra como definirdynamodb.throughput.read.percent
como 1.0 a fim de aumentar a taxa de solicitação de leitura.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
;Você também pode exportar dados para o HDFS usando compactação e formatação, conforme mostrado acima para a exportação para o Amazon S3. Para isso, basta substituir o diretório do Amazon S3 nos exemplos acima por um diretório do HDFS.
Para ler dados de caracteres UTF-8 não imprimíveis no Hive
-
Você pode ler e gravar dados de caracteres UTF-8 não imprimíveis com o Hive usando a cláusula
STORED AS SEQUENCEFILE
ao criar a tabela. Um SequenceFile é o formato de arquivo binário do Hadoop. Você precisa usar o Hadoop para ler esse arquivo. O exemplo a seguir mostra como exportar dados do DynamoDB para o Amazon S3. Você pode usar essa funcionalidade para lidar com caracteres de codificação UTF-8 não imprimíveis.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
;
Importar dados para o DynamoDB
Ao gravar dados no DynamoDB usando o Hive, você deve se certificar de que o número de unidades de capacidade de gravação seja maior do que o número de mapeadores no cluster. Por exemplo, clusters que são executados em instâncias m1.xlarge do EC2 produzem 8 mapeadores por instância. No caso de um cluster que tem 10 instâncias, isso significaria um total de 80 mapeadores. Se as suas unidades de capacidade de gravação não forem maiores que o número de mapeadores no cluster, a operação de gravação do Hive poderá consumir todo o throughput de gravação ou tentar consumir mais throughput do que o provisionado. Para obter mais informações sobre o número de mapeadores produzidos por cada tipo de instância do EC2, consulte Configurar o Hadoop.
O número de mapeadores no Hadoop é controlado pelas divisões de entradas. Se houver poucas divisões, seu comando de gravação talvez não seja capaz de consumir todo o throughput de gravação disponível.
Se um item com a mesma chave existir na tabela do DynamoDB de destino, ele será substituído. Se houver nenhum item com a chave na tabela do DynamoDB de destino, o item será inserido.
Importar uma tabela do Amazon S3 para o DynamoDB
-
Use o Amazon EMR (Amazon EMR) e o Hive para gravar dados do Amazon S3 no 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
;
Importar uma tabela de um bucket do Amazon S3 para o DynamoDB sem especificar um mapeamento de colunas
-
Crie uma tabela
EXTERNAL
que faça referência a dados armazenados no Amazon S3 que foram exportados anteriormente do DynamoDB. Antes de importar, verifique se a tabela exista no DynamoDB e tem o mesmo esquema de chave da tabela do DynamoDB exportada anteriormente. Além disso, a tabela deve ter exatamente uma coluna, do tipomap<string, string>
. Se você criar uma tabela do Hive vinculada ao DynamoDB, poderá chamar o comandoINSERT OVERWRITE
para gravar os dados do Amazon S3 no DynamoDB. Como não há mapeamento de colunas, você não pode consultar tabelas importadas dessa maneira. A importação de dados sem especificar um mapeamento de coluna está disponível no Hive 0.8.1.5 ou versão posterior, que tem suporte na AMI 2.2.3 e posterior do 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
;
Importar uma tabela do HDFS para o DynamoDB
-
Você pode usar o Amazon EMR e o Hive para gravar dados do HDFS no 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
;
Consultar dados no DynamoDB
Os exemplos a seguir mostram as várias maneiras de usar o Amazon EMR para consultar dados armazenados no DynamoDB.
Para encontrar o maior valor para uma coluna mapeada (max
)
-
Use os comandos do Hive como os seguintes. No primeiro comando, a instrução CREATE cria uma tabela do Hive que faz referência aos dados armazenados no DynamoDB. Em seguida, a instrução SELECT usa essa tabela para consultar dados armazenados no DynamoDB. O exemplo a seguir localiza o maior pedido efetuado por um 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 dados usando a cláusula GROUP BY
-
Você pode usar a cláusula
GROUP BY
para coletar dados em vários registros. Muitas vezes, isso é usado com uma função agregada, como sum, count, min ou max. O exemplo a seguir gera uma lista dos maiores pedidos de clientes que efetuaram mais de três 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;
Unir duas tabelas do DynamoDB
-
O exemplo a seguir mapeia duas tabelas do Hive para dados armazenados no DynamoDB. Em seguida, ele chama uma junção entre essas duas tabelas. A junção é calculada no cluster e retornada. A junção não ocorre no DynamoDB. Este exemplo retorna uma lista de clientes e suas compras para clientes que efetuaram mais de dois 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 duas tabelas de diferentes origens
-
No exemplo a seguir, Customer_S3 é uma tabela do Hive que carrega um arquivo CSV armazenado no Amazon S3, e hive_purchases é uma tabela que referencia dados no DynamoDB. O exemplo a seguir une os dados de clientes armazenados como um arquivo CSV no Amazon S3 com os dados de pedidos armazenados no DynamoDB para retornar um conjunto de dados que representa os pedidos efetuados por clientes cujos nomes incluem “Miller”.
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
Nos exemplos anteriores, as instruções CREATE TABLE foram incluídas em cada exemplo para fins de clareza e integridade. Durante a execução de várias consultas ou operações de exportação em uma determinada tabela do Hive, você só precisa criar a tabela uma vez, no início da sessão do Hive.