使用Hive将Dynamodb导出到S3

时间:2017-07-18 21:10:23

标签: json hive amazon-dynamodb emr

我提到了这个链接:http://docs.aws.amazon.com/emr/latest/ReleaseGuide/EMR_Hive_Commands.html

我的hive脚本如下所示:

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; 

Dynamodb表可以成功导出到S3,但文件格式不是JSON,它就像:

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"}

有人知道如何以JSON格式导出吗?我知道我可以使用Data Pipeline,它可以以JSON格式将dynamodb表导出到S3,但出于某种原因我需要使用EMR。我尝试了另一种工具:https://github.com/awslabs/emr-dynamodb-connector,并使用命令:

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

但错误是

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

有人能告诉我如何解决这些问题吗?感谢。

== update ==

如果我使用to_json,正如Chris建议的那样,我的代码如下:

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; 

当我查看生成的文件时,它就像

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

我想要的是嵌套地图,比如

map<string, map<string, string>>

不是

map<string, string>

有人可以给我一些建议吗?感谢。

2 个答案:

答案 0 :(得分:0)

您的SELECT *查询正在发送一个序列化形式的Hive map,但不保证是JSON。您可能需要考虑使用Brickhouse Hive UDF。特别是,调用to_json函数非常适合保证输出中的JSON格式。

  
      
  • to_json - 将任意Hive结构(list,map,named_struct)转换为JSON
  •   
INSERT OVERWRITE TABLE s3TableName SELECT to_json(item) 
FROM hiveTableName;

答案 1 :(得分:0)

2020年11月9日,DynamoDB发布了一项新功能,可将数据导出到S3存储桶-您可以在此处了解更多信息:

https://aws.amazon.com/blogs/aws/new-export-amazon-dynamodb-table-data-to-data-lake-amazon-s3/

这是一种本机,无服务器的解决方案,目前(截至11/20)支持DynamoDB JSON。