将dynamo db记录转换为配置单元中的json数组

0g0grzrc  于 2021-05-31  发布在  Hadoop
关注(0)|答案(0)|浏览(185)

我正在尝试将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

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题