Esempi di comandi Hive per l'esportazione, l'importazione e l'esecuzione di query sui dati in DynamoDB - Amazon EMR

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Esempi di comandi Hive per l'esportazione, l'importazione e l'esecuzione di query sui dati in DynamoDB

Gli esempi seguenti utilizzano i comandi Hive per eseguire operazioni come l'esportazione di dati in Amazon S3 HDFS o l'importazione di dati in DynamoDB, l'unione di tabelle, l'interrogazione di tabelle e altro ancora.

Le operazioni su una tabella Hive fanno riferimento ai dati archiviati in DynamoDB. I comandi di Hive sono soggetti alle impostazioni di velocità effettiva assegnate alla tabella DynamoDB e i dati recuperati includono i dati scritti nella tabella DynamoDB al momento dell'elaborazione della richiesta di operazione Hive da parte di DynamoDB. Se il processo di recupero dei dati richiede molto tempo, rispetto a quando è iniziato il comando Hive alcuni dei dati restituiti potrebbero essere stati aggiornati in DynamoDB.

I comandi Hive DROP TABLE e CREATE TABLE agiscono solo sulle tabelle locali in Hive e non creano né eliminano tabelle in DynamoDB. Se la query Hive fa riferimento a una tabella in DynamoDB, quest'ultima deve già esistere prima di eseguire la query. Per ulteriori informazioni sulla creazione e l'eliminazione di tabelle in DynamoDB, consulta Lavorare con le tabelle in DynamoDB nella Guida per gli sviluppatori di Amazon DynamoDB.

Nota

Quando mappi una tabella Hive su una posizione in Amazon S3, non mapparla al percorso principale del bucket, s3://amzn-s3-demo-bucket, poiché ciò potrebbe causare errori quando Hive scrive i dati su Amazon S3. Mappate invece la tabella su un sottopercorso del bucket, s3://amzn-s3-demo-bucket/mypath.

Esportazione di dati da DynamoDB

È possibile utilizzare Hive per esportare i dati da DynamoDB.

Esportazione di una tabella DynamoDB in un bucket Amazon S3
  • Crea una tabella Hive che faccia riferimento ai dati archiviati in DynamoDB. Quindi puoi chiamare il INSERT OVERWRITE comando per scrivere i dati in una directory esterna. Nell'esempio seguente, s3://bucketname/path/subpath/ è un percorso valido in Amazon S3. Modifica le colonne e i tipi di dati nel CREATE comando in modo che corrispondano ai valori nel tuo DynamoDB. È possibile utilizzare questo metodo per creare un archivio dei dati DynamoDB in 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://bucketname/path/subpath/' SELECT * FROM hiveTableName;
Esportazione di una tabella DynamoDB in un bucket Amazon S3 utilizzando la formattazione
  • Crea una tabella esterna che faccia riferimento a un percorso in Amazon S3. Questo passaggio è mostrato di seguito come s3_export. Durante la CREATE chiamata, specifica la formattazione delle righe per la tabella. Quindi, quando si utilizza INSERT OVERWRITE per esportare dati da DynamoDB a s3_export, i dati vengono scritti nel formato specificato. Nell'esempio seguente, i dati vengono scritti come valori separati da virgole (). 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://bucketname/path/subpath/'; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;
Esportazione di una tabella DynamoDB in un bucket Amazon S3 senza specificare una mappatura di colonna
  • Crea una tabella Hive che faccia riferimento ai dati archiviati in DynamoDB. L'operazione è analoga a quella dell'esempio precedente, salvo che non si specifica una mappatura di colonna. La tabella deve avere esattamente una colonna di tipo map<string, string>. Se si crea una tabella EXTERNAL in Amazon S3 è possibile chiamare il comando INSERT OVERWRITE per scrivere i dati provenienti da DynamoDB su Amazon S3. È possibile utilizzare questo metodo per creare un archivio dei dati DynamoDB in Amazon S3. Poiché non è presente alcuna mappatura di colonna, non è possibile eseguire query in tabelle esportate in questo modo. L'esportazione dei dati senza specificare una mappatura delle colonne è disponibile in Hive 0.8.1.5 o versione successiva, supportata su Amazon 2.2. EMR AMI x e versioni successive.

    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://bucketname/path/subpath/'; INSERT OVERWRITE TABLE s3TableName SELECT * FROM hiveTableName;
Esportazione di una tabella DynamoDB in un bucket Amazon S3 utilizzando la compressione dei dati
  • Hive fornisce diversi codec di compressione che è possibile impostare durante la sessione Hive. In questo modo, i dati esportati vengono compressi nel formato specificato. L'esempio seguente comprime i file esportati utilizzando l'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://bucketname/path/subpath/'; INSERT OVERWRITE TABLE lzo_compression_table SELECT * FROM hiveTableName;

    I codec di compressione disponibili sono:

    • 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

Per esportare una tabella DynamoDB in HDFS
  • Usa il seguente comando Hive, dove hdfs:///directoryName è un HDFS percorso valido e hiveTableName è una tabella in Hive che fa riferimento a DynamoDB. Questa operazione di esportazione è più veloce dell'esportazione di una tabella DynamoDB in Amazon S3 perché Hive 0.7.1.1 HDFS utilizza come passaggio intermedio per l'esportazione dei dati in Amazon S3. L'esempio seguente mostra anche come impostare il valore dynamodb.throughput.read.percent su 1,0 per aumentare la richiesta di lettura.

    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;

    Puoi anche esportare i dati HDFS utilizzando la formattazione e la compressione come mostrato sopra per l'esportazione in Amazon S3. A tale scopo, è sufficiente sostituire la directory Amazon S3 negli esempi precedenti con una HDFS directory.

Per leggere dati non stampabili a UTF -8 caratteri in Hive
  • Puoi leggere e scrivere dati non stampabili a UTF -8 caratteri con Hive utilizzando la STORED AS SEQUENCEFILE clausola quando crei la tabella. A SequenceFile è il formato di file binario Hadoop; è necessario utilizzare Hadoop per leggere questo file. Nell'esempio seguente viene illustrato come esportare dati da DynamoDB verso Amazon S3. È possibile utilizzare questa funzionalità per gestire -8 caratteri codificati non stampabiliUTF.

    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://bucketname/path/subpath/'; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;

Importazione di dati in DynamoDB

Quando scrivi dati in DynamoDB utilizzando Hive, devi assicurarti che il numero delle unità di capacità di scrittura sia maggiore del numero di mappatori del cluster. Ad esempio, i cluster eseguiti su istanze m1.xlarge producono 8 EC2 mappatori per istanza. Nel caso di un cluster che dispone di 10 istanze, ciò significherebbe un totale di 80 mappatori. Se il numero di unità di capacità di scrittura non è superiore al numero di mappatori nel cluster, l'operazione di scrittura Hive potrebbe consumare tutta la velocità effettiva di scrittura o tentare di consumare più velocità effettiva di quanto ne sia stato assegnato. Per ulteriori informazioni sul numero di mappatori prodotti da ciascun tipo di istanza, consulta. EC2 Configura Hadoop

Il numero di mappatori in Hadoop è controllato dalle divisioni in entrata. Se le divisioni sono troppo poche, il comando di scrittura potrebbe non essere in grado di consumare tutto il throughput di scrittura disponibile.

Se un elemento con la stessa chiave è presente nella tabella DynamoDB di destinazione, viene sovrascritto. Se un elemento con la stessa chiave non è presente nella tabella DynamoDB di destinazione, viene inserito.

Importazione di una tabella da Amazon S3 a DynamoDB
  • Puoi usare Amazon EMR (AmazonEMR) e Hive per scrivere dati da Amazon S3 a DynamoDB.

    CREATE EXTERNAL TABLE s3_import(a_col string, b_col bigint, c_col array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION 's3://bucketname/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;
Importazione una tabella da un bucket Amazon S3 a DynamoDB senza specificare una mappatura di colonna
  • Crea una tabella EXTERNAL che faccia riferimento a dati archiviati in Amazon S3 ed esportati in precedenza da DynamoDB. Prima dell'importazione, assicurati che la tabella sia presente in DynamoDB e che abbia lo stesso schema di chiave della tabella DynamoDB esportata in precedenza. La tabella deve inoltre avere esattamente una colonna di tipo map<string, string>. Se si crea una tabella Hive collegata a DynamoDB è possibile chiamare il comando INSERT OVERWRITE per scrivere i dati provenienti da Amazon S3 su DynamoDB. Poiché non è presente alcuna mappatura di colonna, non è possibile eseguire query in tabelle importate in questo modo. L'importazione di dati senza specificare una mappatura delle colonne è disponibile in Hive 0.8.1.5 o versioni successive, supportate su Amazon 2.2.3 e versioni successive. EMR AMI

    CREATE EXTERNAL TABLE s3TableName (item map<string, string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://bucketname/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;
Per importare una tabella da HDFS DynamoDB
  • Puoi usare Amazon EMR e Hive per scrivere dati da HDFS 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;

Esecuzioni di query sui dati in DynamoDB

Gli esempi seguenti mostrano i vari modi in cui puoi usare Amazon EMR per interrogare i dati archiviati in DynamoDB.

Per trovare il valore maggiore per una colonna mappata (max)
  • Utilizzare comandi Hive come quelli indicati di seguito. Nel primo comando, l'CREATEistruzione crea una tabella Hive che fa riferimento ai dati archiviati in DynamoDB. L'SELECTistruzione utilizza quindi tale tabella per interrogare i dati archiviati in DynamoDB. L'esempio seguente trova l'ordine più grande effettuato da un determinato 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;
Per aggregare i dati utilizzando la clausola GROUP BY
  • Puoi utilizzare la clausola GROUP BY per raccogliere dati all'interno di più record. Questa clausola viene spesso utilizzata con una funzione di aggregazione come sum, count, min o max. L'esempio seguente restituisce un elenco degli ordini più grandi di clienti che hanno effettuato più di tre ordini.

    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;
Unione di due tabelle DynamoDB
  • L'esempio seguente mappa due tabelle Hive ai dati archiviati in DynamoDB. quindi chiama un'operazione di unione tra le due tabelle. L'unione viene calcolata nel cluster e in seguito viene restituita. L'unione non si svolge in DynamoDB. Questo esempio restituisce un elenco di clienti e dei loro acquisti per i clienti che hanno effettuato più di due ordini.

    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;
Per unire due tabelle da origini diverse
  • Nell'esempio seguente, Customer_S3 è una tabella Hive che carica un file archiviato CSV in Amazon S3 e hive_purchases è una tabella che fa riferimento ai dati in DynamoDB. L'esempio seguente unisce i dati dei clienti archiviati come CSV file in Amazon S3 con i dati degli ordini archiviati in DynamoDB per restituire un set di dati che rappresenta gli ordini effettuati dai clienti che hanno «Miller» nel loro nome.

    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://bucketname/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

Negli esempi precedenti, le CREATE TABLE dichiarazioni sono state incluse in ogni esempio per motivi di chiarezza e completezza. Se vengono eseguite più operazioni di query o di esportazione su una determinata tabella Hive, è necessario creare la tabella solo una sola volta, all'inizio della sessione Hive.