0

我一直在Redshift中使用UNLOAD语句一段时间,它可以更容易地将文件转储到S3,然后让人们进行分析。亚马逊Redshift - 卸载到S3 - 动态S3文件名

现在已经到了尝试实现自动化的时候了。我们有Amazon Data Pipeline运行几个任务,我想运行SQLActivity自动执行UNLOAD。我使用S3中的SQL脚本。

查询本身是正确的,但我一直在试图找出如何动态分配文件的名称。例如:

UNLOAD('<the_query>') 
TO 's3://my-bucket/' || to_char(current_date) 
WITH CREDENTIALS '<credentials>' 
ALLOWOVERWRITE 
PARALLEL OFF 

不工作,当然,我怀疑你不能在“TO”行执行功能(to_char)。有什么其他方式可以做到吗?

如果UNLOAD是没有办法的办法,我有任何其他选项如何将此类任务结合现有的基础设施(Redshift + S3 + Data Pipeline,我们Amazon EMR尚未生效)自动化。

,我认为可以工作(但不知道)的唯一事情是不是不使用脚本,该脚本复制到Script选项SQLActivity(它指向文件的时刻)和基准{@ScheduleStartTime}

回答

1

为什么不使用RedshiftCopyActivity从Redshift复制到S3?输入是RedshiftDataNode,输出是S3DataNode,您可以在其中指定directoryPath的表达式。

您也可以在RedshiftCopyActivity中指定transformSql属性来覆盖默认值:select * from + inputRedshiftTable。

样品管道:

{ “对象”:[{ “ID”: “CSVId1”, “名”: “DefaultCSV1”, “类型”: “CSV” },{ “ID”: “RedshiftDatabaseId1”, “的databaseName”: “DBNAME”, “用户名”: “用户”, “名”: “DefaultRedshiftDatabase1”, “*密码”: “密码”, “类型”: “RedshiftDatabase”, “clusterId”:“redshiftclusterId” },{ “ID”: “默认”, “scheduleType”: “时间序列”, “failureAndRerunMode”: “CASCADE”, “名”: “默认”, “角色”: “DataPipelineDefaultRole”, “资源角色”: “DataPipelineDefaultResourceRole” },{ “ID”: “RedshiftDataNodeId1”, “时间表”:{ “裁判”: “ScheduleId1” }, “表名”: “订单”, “名”: “DefaultRedshiftDataNode1” , “type”:“RedshiftDataNode”, “database”:{ “ref”:“RedshiftDatabaseId1” } },{ “ID”: “Ec2ResourceId1”, “时间表”:{ “裁判”: “ScheduleId1” }, “securityGroups”: “MySecurityGroup”, “名”: “DefaultEc2Resource1”, “角色”:“ DataPipelineDefaultRole “ ”logUri“: ”S3:// myLogs“, ”资源角色“: ”DataPipelineDefaultResourceRole“, ”类型“: ”Ec2Resource“ },{ ”myComment“:” 这个目的是用来控制任务时间表“, ”id“:”DefaultSchedule1“, ”name“:”RunOnce“, ”occurrences“:”1“, ”period“:”1 Day“, ”type“:”Schedule“ , “startAt”: “FIRST_ACTIVATION_DATE_TIME” },{ “ID”: “S3DataNodeId1”, “时间表”:{ “REF”: “ScheduleId1” }, “目录路径”:“S3://我的 - 桶/#{format(@scheduledStartTime,'YYYY-MM-dd-HH-mm-ss')}“, ”name“:”DefaultS3DataNode1“, ”dataFormat“:{ ”ref“:”CSVId1“ }, “类型”: “S3DataNode” },{ “ID”: “RedshiftCopyActivityId1”, “输出”:{ “REF”: “S3DataNodeId1” }, “输入”:{ “REF”: “RedshiftDataNodeId1” }, “时间表”:{ “REF”: “ScheduleId1” }, “名称”: “DefaultRedshiftCopyActivity1”, “runsOn”:{ “REF”:“Ec2ResourceId1 “ }, ”类型“: ”RedshiftCopyActivity“ }]}

0

您能够通过SSH进入集群?如果是这样,我会建议编写一个shell脚本,您可以在其中创建变量和内容,然后将这些变量传递到连接的语句中 - 查询