我正在尝试将dynamo db行转换为json数组,其中每个记录都是使用hive的json对象。dynamodb记录没有任何像字符串集这样的复杂对象,只有字符串和数字。下面是dynamo db表中的示例记录和预期输出。
发电机db记录示例
记录1
{"HK":"key2","metadata2":"value03","metadata3":"value04","time":1582615312881}
记录2
{"HK":"key2","metadata2":"value03","metadata3":"value04","time":1582615312881}
记录3
{"HK":"key3","metadata3":"value06","time":1582615314398}
如果您没有注意到,metadata3在第一个记录中不可用,metadata1在第二个记录中不可用。就像所有其他记录一样。
s3中的期望输出
[
{
"HK": "key1",
"metadata1": "value01",
"metadata2": "value02",
"time": 1582615006772
},
{
"HK": "key2",
"metadata2": "value03",
"metadata3": "value04",
"time": 1582615312881
},
{
"HK": "key3",
"metadata3": "value06",
"time": 1582615314398
}
]
注意:输出不需要非常格式化。我在这里格式化以便阅读。
方法1:
我遵循这个指南将数据从dynamodb导出到s3。
CREATE EXTERNAL TABLE MetadataTable (item map<string,string>)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "MetadataTable");
CREATE EXTERNAL TABLE s3TableName (item map<string, string>)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE
LOCATION 's3://gokul-ddb-metadata/metadata/';
INSERT OVERWRITE TABLE s3TableName SELECT * FROM MetadataTable;
输出为
{
"HK": "{\"s\":\"key1\"}",
"metadata1": "{\"s\":\"value01\"}",
"metadata2": "{\"s\":\"value02\"}",
"time": "{\"n\":\"1582615006772\"}"
}
{
"HK": "{\"s\":\"key2\"}",
"metadata2": "{\"s\":\"value03\"}",
"metadata3": "{\"s\":\"value04\"}",
"time": "{\"n\":\"1582615312881\"}"
}
{
"HK": "{\"s\":\"key2\"}",
"metadata3": "{\"s\":\"value06\"}",
"time": "{\"n\":\"1582615314398\"}"
}
注意:为了便于阅读,我已经格式化了输出。
因此输出不是预期的格式,因此我转向列Map方法,如下所示。
方法2:
遵循与上述相同的指南。
CREATE EXTERNAL TABLE MetadataJson (HK STRING, metadata1 STRING, metadata2 STRING, metadata3 STRING, time BIGINT)
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES (
"dynamodb.table.name" = "MetadataTable",
"dynamodb.column.mapping" = "HK:HK,metadata1:metadata1,metadata2:metadata2,metadata3:metadata3,time:time"
);
CREATE EXTERNAL TABLE s3MedataJson(HK STRING, metadata1 STRING, metadata2 STRING, metadata3 STRING, time BIGINT)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
WITH SERDEPROPERTIES ( "ignore.malformed.json" = "true")
STORED AS TEXTFILE
LOCATION 's3://gokul-ddb-metadata/metadata/json';
INSERT OVERWRITE TABLE s3MedataJson SELECT * FROM MetadataJson;
输出为
{
"HK": "key1",
"metadata1": "value01",
"metadata2": "value02",
"metadata3": null,
"time": 1582615006772"
}
{
"HK": "key2",
"metadata1": null,
"metadata2": "value03",
"metadata3": "value04",
"time": 1582615312881
}
{
"HK": "key3",
"metadata1": null,
"metadata2": null,
"metadata3": "value06",
"time": 1582615314398
}
希望您注意到空值列,使用 WITH SERDEPROPERTIES ( "ignore.malformed.json" = "true")
无法删除输出上的空值。
目前还没有达到预期的效果,我也不知道如何进行,如果有人有类似的经验,请在这里分享解决方案。
我使用的hive版本是hive2.3.6-amzn-2
暂无答案!
目前还没有任何答案,快来回答吧!