Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Exemples de commandes Hive pour l'exportation, l'importation et l'interrogation de données dans DynamoDB
Les exemples suivants utilisent les commandes Hive afin d'effectuer des opérations telles que l'exportation de données vers Amazon S3 ou HDFS, l'importation de données vers DynamoDB, la jointure de tables, l'interrogation de tables, et plus encore.
Les opérations sur une table Hive référencent les données stockées dans DynamoDB. Les commandes Hive sont soumises aux paramètres de débit alloué de la table DynamoDB et les données extraites incluent les données écrites dans la table DynamoDB au moment où la demande d'opération Hive est traitée par DynamoDB. Si le processus de récupération des données prend du temps, certaines données retournées par la commande Hive peuvent avoir été mises à jour dans DynamoDB depuis que la commande Hive a commencé.
Les commandes Hive DROP TABLE
et CREATE TABLE
agissent uniquement sur les tables locales de Hive et ne créent ni ne suppriment de tables dans DynamoDB. Si votre requête Hive fait référence à une table dans DynamoDB, cette table doit déjà exister avant que vous exécutiez la requête. Pour plus d'informations sur la création et la suppression de tables dans DynamoDB, consultez Utilisation de tables dans DynamoDB dans le Guide du développeur Amazon DynamoDB.
Note
Lorsque vous mappez une table Hive à un emplacement dans Amazon S3, ne la mappez pas au chemin racine du compartiment, s3://amzn-s3-demo-bucket, car cela peut provoquer des erreurs lorsque Hive écrit les données dans Amazon S3. Mappez plutôt la table à un sous-chemin du bucket, s3://amzn-s3-demo-bucket/mypath.
Exportation de données à partir de DynamoDB
Vous pouvez utiliser Hive pour exporter des données à partir de DynamoDB.
Pour exporter une table DynamoDB vers un compartiment Amazon S3
-
Créez une table Hive qui référence les données stockées dans DynamoDB. Ensuite, vous pouvez appeler la commande INSERT OVERWRITE pour écrire les données dans un répertoire externe. Dans l'exemple suivant,
s3://amzn-s3-demo-bucket/path/subpath/
il s'agit d'un chemin valide dans Amazon S3. Ajustez les colonnes et les types de données dans la commande CREATE pour faire correspondre les valeurs dans votre DynamoDB. Vous pouvez l'utiliser pour créer une archive de vos données DynamoDB dans 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
;
Pour exporter une table DynamoDB vers un compartiment Amazon S3 à l'aide de la compartimentation.
-
Créez une table externe qui fait référence à un emplacement dans Amazon S3. Cela est présenté ci-dessous en tant que s3_export. Pendant l'appel CREATE, spécifiez le formatage des lignes de la table. Puis, lorsque vous utilisez INSERT OVERWRITE pour exporter les données de DynamoDB vers s3_export, les données sont écrites au format spécifié. Dans l'exemple suivant, les données sont écrites sous forme de valeurs séparées par des virgules (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
;
Pour exporter une table DynamoDB vers un compartiment Amazon S3 sans spécifier de mappage de colonne
-
Créez une table Hive qui référence les données stockées dans DynamoDB. Cet exemple est similaire au précédent, sauf que vous ne spécifiez pas un mappage de colonne. La table doit avoir exactement une colonne de type
map<string, string>
. Si vous créez ensuite une tableEXTERNAL
dans Amazon S3, vous pouvez appeler la commandeINSERT OVERWRITE
pour écrire les données de DynamoDB vers Amazon S3. Vous pouvez l'utiliser pour créer une archive de vos données DynamoDB dans Amazon S3. Comme il n'y a aucun mappage de colonnes, vous ne pouvez pas interroger les tables qui sont exportées de cette façon. L'exportation de données sans spécifier de mappage de colonne est disponible dans Hive 0.8.1.5 (ou version ultérieure), qui est prise en charge sur l'AMI Amazon EMR 2.2.x et les versions ultérieures.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
;
Pour exporter une table DynamoDB vers un compartiment Amazon S3 en utilisant la compartimentation des données
-
Hive fournit plusieurs codecs de compression, que vous pouvez définir durant votre session Hive. Les données exportées sont ainsi compressées au format spécifié. L'exemple suivant compresse les fichiers exportés à l'aide de l'algorithme 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
;Les codecs de compression disponibles sont les suivants :
-
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
-
Pour exporter une table DynamoDB vers HDFS
-
Utilisez la commande Hive suivante, où se
hdfs:///directoryName
trouve un chemin HDFS valide ethiveTableName
une table dans Hive qui fait référence à DynamoDB. Cette opération d'exportation est plus rapide que l'exportation d'une table DynamoDB vers Amazon S3, car Hive 0.7.1.1 utilise HDFS comme étape intermédiaire lors de l'exportation des données vers Amazon S3. L'exemple suivant montre aussi comment définirdynamodb.throughput.read.percent
sur 1.0 afin d'augmenter le taux de demande de lecture.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
;Vous pouvez également exporter les données vers HDFS à l'aide de la mise en forme et de la compression comme indiqué ci-dessus pour l'exportation vers Amazon S3. Pour ce faire, remplacez simplement le répertoire Amazon S3 dans les exemples ci-dessus par un répertoire HDFS.
Pour lire les données de caractères UTF-8 non affichables dans Hive
-
Vous pouvez lire et écrire des données de caractères UTF-8 non affichables avec Hive en utilisant la clause
STORED AS SEQUENCEFILE
lorsque vous créez la table. A SequenceFile est le format de fichier binaire Hadoop ; vous devez utiliser Hadoop pour lire ce fichier. L'exemple suivant montre comment exporter des données de DynamoDB vers Amazon S3. Vous pouvez utiliser cette fonctionnalité pour gérer les caractères codés UTF-8 non affichables.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
;
Importation de données dans DynamoDB
Lorsque vous écrivez des données sur DynamoDB à l'aide de Hive, vous devez vous assurer que le nombre d'unités de capacité d'écriture est supérieur au nombre de mappeurs dans le cluster. Par exemple, les clusters qui s'exécutent sur des EC2 instances m1.xlarge produisent 8 mappeurs par instance. Dans le cas d'un cluster qui possède 10 instances, cela signifie un total de 80 mappeurs. Si vos unités de capacité en écriture ne sont pas supérieures au nombre de mappeurs dans le cluster, l'opération d'écriture Hive peut consommer la totalité du débit d'écriture ou tenter d'utiliser plus de débit qu'il n'en est alloué. Pour plus d'informations sur le nombre de mappeurs produits par chaque type d' EC2 instance, consultezConfiguration de Hadoop.
Le nombre de mappeurs dans Hadoop est contrôlé par les divisions en entrée. S'il y a trop peu de divisions, votre commande d'écriture peut ne pas être en mesure d'utiliser tout le débit d'écriture disponible.
Si un élément avec la même clé existe dans la table DynamoDB cible, il est remplacé. Si aucun élément avec la clé n'existe dans la table DynamoDB cible, l'élément est inséré.
Pour importer une table d'Amazon S3 vers DynamoDB
-
Vous pouvez utiliser Amazon EMR (Amazon EMR) et Hive pour écrire des données d'Amazon S3 vers 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
;
Pour importer une table depuis un compartiment Amazon S3 vers DynamoDB sans spécifier de mappage de colonne
-
Créez une table
EXTERNAL
qui référence les données stockées dans Amazon S3 et précédemment exportées depuis DynamoDB. Avant de les importer, vérifiez que la table existe dans DynamoDB et qu'elle possède le même schéma de clés que la table DynamoDB précédemment exportée. En outre, la table doit avoir une seule colonne de typemap<string, string>
. Si vous créez ensuite une table Hive liée à DynamoDB, vous pouvez appeler la commandeINSERT OVERWRITE
pour écrire les données depuis Amazon S3 vers DynamoDB. Comme il n'existe aucun mappage de colonne, vous ne pouvez pas interroger les tables qui sont importées de cette façon. L'importation de données sans spécifier un mappage de colonne est disponible dans Hive 0.8.1.5 ou version ultérieure, qui est pris en charge sur Amazon EMR AMI 2.2.3.x et version ultérieure.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
;
Pour importer une table de HDFS vers DynamoDB
-
Vous pouvez utiliser Amazon EMR et Hive pour écrire des données de HDFS vers 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
;
Interrogation de données dans DynamoDB
Les exemples suivants illustrent les différentes façons dont vous pouvez utiliser Amazon EMR pour interroger les données stockées dans DynamoDB.
Pour trouver la plus grande valeur pour une colonne mappée (max
)
-
Utilisez les commandes de Hive comme suit. Dans la première commande, l'instruction CREATE crée une table Hive qui référence les données stockées dans DynamoDB. L'instruction SELECT utilise ensuite cette table pour interroger les données stockées dans DynamoDB. L'exemple suivant recherche la plus grande commande passée par un client donné.
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;
Pour regrouper les données à l'aide de la clause GROUP BY
-
Vous pouvez utiliser la clause
GROUP BY
pour collecter les données de plusieurs enregistrements. Cette option est souvent utilisée avec une fonction d'agrégation comme somme, décompte, min ou max. L'exemple suivant retourne une liste des commandes les plus importantes des clients ayant passé plus de trois commandes.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;
Pour joindre deux tables DynamoDB
-
L'exemple suivant mappe deux tables Hive avec des données stockées dans DynamoDB. Il appelle ensuite une jointure entre ces deux tables. La jointure est calculée sur le cluster, puis renvoyée. La jointure n'a pas lieu dans DynamoDB. Cet exemple renvoie une liste de clients et de leurs achats pour ceux ayant passé plus de deux commandes.
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;
Pour joindre deux tables de différentes sources
-
Dans l'exemple suivant, Customer_S3 est une table Hive qui charge un fichier CSV stocké dans Amazon S3 et hive_purchases est une table qui fait référence aux données de DynamoDB. L'exemple suivant joint les données client stockées comme fichier CSV dans Amazon S3 et les données relatives aux commandes stockées dans DynamoDB pour renvoyer un ensemble de données représentant les commandes passées par les clients ayant « Miller » dans leur nom.
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%';
Note
Dans les exemples précédents, les instructions CREATE TABLE ont été incluses dans chaque exemple pour des raisons de clarté et d'exhaustivité. Lorsque vous exécutez plusieurs requêtes ou opérations d'exportation sur une table Hive donnée, vous ne devez créer la table qu'une seule fois, au début de la session Hive.