2017-07-18 1 views
1

J'ai fait référence à ce lien: http://docs.aws.amazon.com/emr/latest/ReleaseGuide/EMR_Hive_Commands.html.Exporter Dynamodb à S3 en utilisant Hive

Mon script ruche est comme ci-dessous:

DROP TABLE IF EXISTS hiveTableName; 
CREATE EXTERNAL TABLE hiveTableName (item map<string,string>) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
TBLPROPERTIES ("dynamodb.table.name" = "test_table", "dynamodb.region"="us-west-2"); 

DROP TABLE IF EXISTS s3TableName; 
CREATE EXTERNAL TABLE s3TableName (item map<string, string>) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' 
LOCATION 's3://bucket/test-hive2'; 

SET dynamodb.throughput.read.percent=0.8; 

INSERT OVERWRITE TABLE s3TableName SELECT * 
FROM hiveTableName; 

Table DynamoDB peut être exporté avec succès à S3, mais le format de fichier n'est pas JSON, il est comme:

uuid{"s":"db154955-8555-4b49-bf40-ee36605ac510"}num{"n":"1294"}info{"s":"qwefjdkslafjdafl"} 
uuid{"s":"d9898564-2b56-42ba-9cfb-fd092e7d0b8d"}num{"n":"100"}info{"s":"qwefjdkslafjdafl"} 

Est-ce que quelqu'un sait comment exporter au format JSON? Je sais que je peux utiliser Data Pipeline, et il peut exporter la table dynamodb vers S3 au format JSON, mais pour une raison quelconque, j'ai besoin d'utiliser EMR. J'ai essayé un autre outil: https://github.com/awslabs/emr-dynamodb-connector, et utiliser la commande:

java -cp target/emr-dynamodb-tools-4.2.0-SNAPSHOT.jar org.apache.hadoop.dynamodb.tools.DynamoDBExport /where/output/should/go my-dynamo-table-name 

mais l'erreur a été

Error: Could not find or load main class org.apache.hadoop.dynamodb.tools.DynamoDBExport 

Quelqu'un peut-il me dire comment résoudre ces problèmes? Merci.

mise à jour == ==

Si je to_json, comme Chris a suggéré, mon code est comme ci-dessous:

DROP TABLE IF EXISTS hiveTableName2; 
CREATE EXTERNAL TABLE hiveTableName2 (item map<string, string>) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' 
TBLPROPERTIES ("dynamodb.table.name" = "test_table", "dynamodb.region"="us-west-2"); 

DROP TABLE IF EXISTS s3TableName2; 
CREATE EXTERNAL TABLE s3TableName2 (item string) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' 
LOCATION 's3://backup-restore-dynamodb/hive-test'; 

INSERT OVERWRITE TABLE s3TableName2 SELECT to_json(item) 
FROM hiveTableName2; 

Quand je regarde le fichier généré, il est comme

{"uuid":"{\"s\":\"db154955-8555-4b49-bf40-ee36605ac510\"}","num":"{\"n\":\"1294\"}","info":"{\"s\":\"qwefjdkslafjdafl\"}"} 

Ce que je veux est une carte imbriquée, comme

map<string, map<string, string>> 

pas

map<string, string> 

Quelqu'un peut-il me donner quelques suggestions? Merci.

Répondre

0

Votre requête SELECT * émet une forme sérialisée de la ruche map, qui n'est pas garantie être JSON. Vous pouvez envisager d'utiliser le Brickhouse Hive UDF. En particulier, l'appel de la fonction to_json conviendrait parfaitement pour garantir un format JSON dans votre sortie.

  • to_json - Convertir une structure arbitraire Hive (liste, carte, named_struct) en JSON
INSERT OVERWRITE TABLE s3TableName SELECT to_json(item) 
FROM hiveTableName; 
+0

Merci Chris! Mais j'ai toujours un problème, s'il vous plaît se référer à la question mise à jour. –