Amazon Redshift - 卸载到 S3 - 动态 S3 文件名[英] Amazon Redshift - Unload to S3 - Dynamic S3 file name

本文是小编为大家收集整理的关于Amazon Redshift - 卸载到 S3 - 动态 S3 文件名的处理方法,想解了Amazon Redshift - 卸载到 S3 - 动态 S3 文件名的问题怎么解决?Amazon Redshift - 卸载到 S3 - 动态 S3 文件名问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我在 Redshift 中使用 UNLOAD 语句已经有一段时间了,它可以更轻松地将文件转储到 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 尚未激活).

我认为唯一可行的(但不确定)不是使用脚本,而是将脚本复制到 SQLActivity 中的 Script 选项中(目前它指向一个文件)并引用 {@ScheduleStartTime}

推荐答案

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

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

示例管道:

{"对象":[{"id": "CSVId1","name": "DefaultCSV1","类型":"CSV"}, {"id": "RedshiftDatabaseId1","数据库名称":"数据库名称","用户名": "用户","name": "DefaultRedshiftDatabase1","*password": "密码","type": "RedshiftDatabase","clusterId": "redshiftclusterId"}, {"id": "默认","scheduleType": "时间序列","failureAndRerunMode": "级联","name": "默认","role": "DataPipelineDefaultRole","resourceRole": "DataPipelineDefaultResourceRole"}, {"id": "RedshiftDataNodeId1","日程": {"ref": "ScheduleId1"},"tableName": "订单","name": "DefaultRedshiftDataNode1","type": "RedshiftDataNode","数据库":{"ref": "RedshiftDatabaseId1"}}, {"id": "Ec2ResourceId1","日程": {"ref": "ScheduleId1"},"securityGroups": "MySecurityGroup","name": "DefaultEc2Resource1","role": "DataPipelineDefaultRole","logUri": "s3://myLogs","resourceRole": "DataPipelineDefaultResourceRole","类型":"Ec2Resource"}, {"myComment": "该对象用于控制任务调度.","id": "DefaultSchedule1","name": "RunOnce","出现次数":"1","期间": "1 天","type": "日程","startAt": "FIRST_ACTIVATION_DATE_TIME"}, {"id": "S3DataNodeId1","日程": {"ref": "ScheduleId1"},"directoryPath": "s3://my-bucket/#{format(@scheduledStartTime, 'YYYY-MM-dd-HH-mm-ss')}","name": "DefaultS3DataNode1","数据格式":{"ref": "CSVId1"},"类型":"S3DataNode"}, {"id": "RedshiftCopyActivityId1","输出": {"ref": "S3DataNodeId1"},"输入": {"ref": "RedshiftDataNodeId1"},"日程": {"ref": "ScheduleId1"},"name": "DefaultRedshiftCopyActivity1","运行":{"ref": "Ec2ResourceId1"},"类型":"红移复制活动"}]}

其他推荐答案

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

其他推荐答案

通过在 unload 语句周围使用 redshift 程序包装器并动态派生 s3 路径名.

执行动态查询,并在您的作业中调用动态创建 UNLOAD 语句并执行该语句的过程.

这样您就可以避开其他服务.但取决于您正在处理的用例类型.

本文地址:https://www.itbaoku.cn/post/1764179.html