使用Hive将Dynamodb导出到S3
问题描述:
我参考了此链接:http://docs.aws.amazon.com/emr/latest/ReleaseGuide/EMR_Hive_Commands.html。使用Hive将Dynamodb导出到S3
我的蜂巢脚本是象下面这样:
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格式导出?我知道我可以使用数据管道,并且它可以以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
有人能告诉我如何解决这些问题?谢谢。
== ==更新
如果我使用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>
有人可以给我一些建议吗?谢谢。
答
您的SELECT *
查询发出Hive map
的序列化格式,该格式不保证是JSON。您可能要考虑使用Brickhouse Hive UDF。特别是,调用to_json
函数将非常适合在输出中保证JSON格式。
- to_json - 转换任意蜂巢结构(列表,地图,named_struct)成JSON
INSERT OVERWRITE TABLE s3TableName SELECT to_json(item)
FROM hiveTableName;
谢谢克里斯!但我仍然有问题,请参阅更新后的问题。 –