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

Nei seguenti esempi vengono utilizzati comandi Hive per eseguire operazioni quali l'esportazione di dati su Amazon S3 o HDFS, l'importazione di dati in DynamoDB, l'unione di tabelle, l'esecuzione di query su tabelle e molto altro.

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 esegui la mappatura di una tabella Hive a una posizione in Amazon S3, evita di mapparla al percorso principale del bucket, s3://mybucket, in quanto questo potrebbe causare errori durante le operazioni di scrittura dei dati su Amazon S3 da parte di Hive. Esegui invece la mappatura della tabella a un percorso secondario del bucket, s3://mybucket/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. A questo punto è possibile chiamare il comando INSERT OVERWRITE per scrivere i dati su una directory esterna. In questo esempio, s3://bucketname/path/subpath/ è un percorso valido in Amazon S3. Modifica le colonne e i tipi di dati nel comando CREATE (CREA) perché corrispondano ai valori in 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 chiamata CREATE, specificare la formattazione della riga per la tabella. Quindi, quando si utilizza INSERT OVERWRITE per esportare i dati da DynamoDB in s3_export, i dati vengono scritti nel formato specificato. In questo esempio, i dati vengono scritti come valori separati da virgola (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 di colonna è disponibile in Hive versione 0.8.1.5 o successive, supportate sull'AMI Amazon EMR versione 2.2.x e 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

Esportazione di una tabella DynamoDB in HDFS
  • Usa il seguente comando Hive, dove hdfs: ///DirectoryName è un percorso HDFS valido ed hiveTableNameè una tabella in Hive che fa riferimento a DynamoDB. Questa operazione di esportazione è più veloce dell'esportazione di una tabella DynamoDB su Amazon S3, perché Hive 0.7.1.1 usa HDFS come fase intermediaria per l'esportazione di dati su 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;

    È anche possibile esportare i dati su HDFS utilizzando la formattazione e la compressione come illustrato sopra per l'esportazione ad Amazon S3. Per farlo, è sufficiente sostituire la directory Amazon S3 negli esempi sopra con una directory HDFS.

Per leggere dati di caratteri UTF-8 non stampabili in Hive
  • È possibile leggere e scrivere dati di caratteri UTF-8 non stampabili con Hive utilizzando la clausola STORED AS SEQUENCEFILE nella creazione di una 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. Puoi utilizzare questa funzionalità per gestire i caratteri in codifica UTF-8 non stampabili.

    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 in esecuzione su istanze EC2 m1.xlarge producono 8 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 creato da ogni tipo di istanza EC2, consulta 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
  • È possibile utilizzare Amazon EMR e Hive per scrivere i 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 dei dati senza specificare una mappatura di colonna è disponibile in Hive versione 0.8.1.5 o successive, supportate sull'AMI Amazon EMR 2.2.3 e successive.

    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;
Importazione di una tabella da HDFS a DynamoDB
  • È possibile utilizzare Amazon EMR e Hive per scrivere i dati da HDFS a 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

Negli esempi seguenti vengono illustrati i diversi modi in cui puoi utilizzare Amazon EMR per eseguire query sui 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'istruzione CREATE (CREA) crea una tabella Hive che faccia riferimento ai dati archiviati in DynamoDB. L'istruzione SELECT usa quindi la tabella per eseguire una query sui 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
  • In questo esempio, Customer_S3 è una tabella Hive che carica un file CSV archiviato in Amazon S3, mentre hive_purchases è una tabella che fa riferimento ai dati in DynamoDB. L'esempio seguente unisce i dati dei clienti memorizzati come file CSV in Amazon S3 con i dati degli ordini archiviati in DynamoDB per restituire un set di dati che rappresenta gli ordini effettuati dai clienti il cui nome contiene la parola "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 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

In esempi precedenti, le istruzioni CREATE TABLE erano incluse in ciascun esempio per 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.