使用 Hive 将 Dynamodb 导出到 S3

Posted

技术标签:

【中文标题】使用 Hive 将 Dynamodb 导出到 S3【英文标题】:Export Dynamodb to S3 using Hive 【发布时间】:2017-07-18 21:10:22 【问题描述】:

我参考了这个链接: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,它可以将 dynamodb 表以 JSON 格式导出到 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

谁能告诉我如何解决这些问题?谢谢。

== 更新 ==

如果我按照 Chris 的建议使用 to_json,我的代码如下:

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>

谁能给我一些建议?谢谢。

【问题讨论】:

【参考方案1】:

您的 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;

【讨论】:

谢谢你,克里斯!但是我还是有问题,请参考更新后的问题。【参考方案2】:

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。

【讨论】:

以上是关于使用 Hive 将 Dynamodb 导出到 S3的主要内容,如果未能解决你的问题,请参考以下文章

Aws Dynamodb数据导出到S3

最佳方法:如何将 dynamodb 表导出到 csv 并将其存储在 s3

如何将 AWS DynamoDB 表导出到 S3 存储桶?

如何使用 EMR 上的 HiveQL 将 DynamoDB 上的 Map 数据类型列导出到具有 JSON 数据类型的 S3?

如何在使用 EMR/Hive 将数据从 S3 导入 DynamoDB 时处理包含在引号 (CSV) 中的字段

从S3中导入数据到Dynamodb