2017-07-18 83 views
1

我參考了此鏈接: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> 

有人可以給我一些建議嗎?謝謝。

回答

0

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

謝謝克里斯!但我仍然有問題,請參閱更新後的問題。 –