dynamodb导出为gzip json

q9rjltbz  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(303)

我使用aws数据管道导出了dynamodb表,datanodes>s3backuplocation>compression设置为 GZIP . 我希望压缩输出带有 .gz 扩展,但我得到了没有扩展的未压缩输出。
进一步阅读会发现,压缩字段“仅支持与amazonredshift一起使用,以及在将s3datanode与copyactivity一起使用时使用”
如何将dynamodb表的gzip备份到s3中?我必须下载所有的文件,gzip文件,然后上传它们吗?有没有一种方法可以让管道与copyactivity一起工作?有更好的方法吗?
我一直在尝试使用配置单元进行导出,但还没有找到一种方法来正确设置输出的格式。它需要与下面的格式匹配,以便emr作业可以将其与来自另一个源的数据一起读取。

{"col1":{"n":"596487.0550532"},"col2":{"s":"xxxx-xxxx-xxxx"},"col3":{"s":"xxxx-xxxx-xxxx"}}
{"col1":{"n":"234573.7390354"},"col2":{"s":"xxxx-xxxx-xxxx"},"col3":{"s":"xxxx-xxxxx-xx"}}
{"col2":{"s":"xxxx-xxxx-xxxx"},"col1":{"n":"6765424.7390354"},"col3":{"s":"xxxx-xxxxx-xx"}}
ymzxtsji

ymzxtsji1#

我也一直在寻找如何做到这一点。这是一个如此基本的请求,我很惊讶它不是基本数据管道工作流的一部分。
经过几天的调查和实验,我发现了两种机制:
1) 使用shellcommandactivity启动几个awscli命令(s3cp,gzip)从s3,gzip本地下载,然后重新上载到s3。以下是相关部分:

{
    "name": "CliActivity",
    "id": "CliActivity",
    "runsOn": {
        "ref": "Ec2Instance"
    },
    "type": "ShellCommandActivity",
    "command": "(sudo yum -y update aws-cli) && (#{myCopyS3ToLocal}) && (#{myGzip}) && (#{myCopyLocalToS3})"
},

"values": {
    "myCopyS3ToLocal": "aws s3 cp s3://your-bucket/your-folders/ --recursive",
    "myGzip": "for file in /tmp/random-date/*; do gzip \"$file\"; done",
    "myCopyLocalToS3": "aws s3 cp /tmp/random-date s3://your-bucket/your-folders-gz/ --recursive"
}

2) 创建一个单独的emr集群,然后创建一个使用该emr集群运行s3distcp(s3distcp)的数据管道。

{
    "name": "CliActivity",
    "id": "CliActivity",
    "runsOn": {
        "ref": "Ec2Instance"
    },
    "type": "ShellCommandActivity",
    "command": "(sudo yum -y update aws-cli) && (#{myAWSCLICmd})"
},

"values": {
    "myAWSCLICmd": "aws emr add-steps --cluster-id j-XXXXYYYYZZZZ --region us-east-1 --steps Name=\"S3DistCp command runner\",Jar=\"command-runner.jar\",Args=[\"s3-dist-cp\",\"--s3Endpoint=s3.amazonaws.com\",\"--src=s3://your-bucket/your-folders/\",\"--dest=s3://your-bucket/your-folders-gz/\",\"--outputCodec=gz\"]"
}

在两者之间,我喜欢第二个,因为s3distcp可以自动删除源s3文件。但是,它需要一个单独的emr集群来运行(成本更高)。或者您可以在#1中添加其他步骤来执行删除操作。
另外,如果要参数化,可能需要直接内联这些值,以便可以利用#{format(@scheduledstarttime,'yyyy-mm-dd\uhh.mm')}。

相关问题