0

Я использую оператор UNLOAD в Redshift некоторое время, это облегчает отправку файла в S3, а затем позволяет людям анализировать.Amazon Redshift - Unload to S3 - имя файла Dynamic S3

Пришло время попытаться автоматизировать его. У нас есть Amazon Data Pipeline, работающий для нескольких задач, и я хотел запустить SQLActivity для автоматического выполнения UNLOAD. Я использую сценарий SQL, размещенный в S3.

Сам запрос правильный, но то, что я пытаюсь выяснить, - как я могу динамически назначать имя файла. Например:

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

не работает, и, конечно, я подозреваю, что вы не можете выполнить функции (to_char) в строке «TO». Есть ли другой способ, которым я могу это сделать?

И если UNLOAD это не так, у меня есть какие-либо другие варианты, как автоматизировать такие задачи, с текущей доступной инфраструктуры (Redshift + S3 + Data Pipeline, наш Amazon EMR еще не активирована).

Единственное, что я думал, что мог бы работать (но не уверен) не вместо использования скрипта, чтобы скопировать скрипт в опции Script в SQLActivity (на данный момент он указывает на файл) и ссылаться на {@ScheduleStartTime}

ответ

1

Почему бы не использовать RedshiftCopyActivity для копирования с Redshift на S3? Входом является RedshiftDataNode, а вывод - S3DataNode, где вы можете указать выражение для directoryPath.

Вы также можете указать свойство transformSql в RedshiftCopyActivity, чтобы переопределить значение по умолчанию: select * from + inputRedshiftTable.

Пример трубопровода:

{ "объекты": [{ "идентификатор": "CSVId1", "название" : "DefaultCSV1", "тип" : "CSV" }, { "идентификатор": "RedshiftDatabaseId1", "Databasename": "имя_бд", "имя пользователя": "пользователь", "имя": "DefaultRedshiftDatabase1", "* пароль": "пароль", "Тип": «RedshiftDatabase», «clusterId»: «redshiftclusterId» }, { "идентификатор": "По умолчанию", "scheduleType": "таймсерия", "failureAndRerunMode": "КАСКАД", "Название": "По умолчанию", "роль": "DataPipelineDefaultRole", "resourceRole": "DataPipelineDefaultResourceRole" }, { "идентификатор": "RedshiftDataNodeId1", "расписание": { "реф": "ScheduleId1" }, "TABLENAME": "заказы", "имя" : "DefaultRedshiftDataNode1" , "type": "RedshiftDataNode", "database": { "ref": "RedshiftDatabaseId1" } }, { "идентификатор": "Ec2ResourceId1", "Расписание": { "ссылка": "ScheduleId1" }, "securityGroups": "MySecurityGroup", "название" : "DefaultEc2Resource1", "роль": " DataPipelineDefaultRole " "logUri": "s3: // myLogs", "resourceRole": "DataPipelineDefaultResourceRole", "типа": "Ec2Resource" }, { "myComment":" Этот объект используется для управления «0», «id»: «DefaultSchedule1», «имя»: «RunOnce», «вхождения»: «1», «период»: «1 день», «type»: «Schedule» ,"startAt": "FIRST_ACTIVATION_DATE_TIME" }, { "идентификатор": "S3DataNodeId1", "Расписание": { "ссылка": "ScheduleId1" }, "DirectoryPath": «s3: // my- bucket/# {format (@scheduledStartTime, 'YYYY-MM-dd-HH-mm-ss')} ", " name ":" DefaultS3DataNode1 ", " dataFormat ": { " ref ":" CSVId1 " }, "типа": "S3DataNode" }, { "идентификатор": "RedshiftCopyActivityId1", "выход": { "исх": "S3DataNodeId1" }, "вход": { "ссылка": "RedshiftDataNodeId1" }, "Расписание": { "ссылка": "ScheduleId1" }, "имя" : "DefaultRedshiftCopyActivity1", "runsOn": { "ссылка": «Ec2ResourceId1 " }, "типа": "RedshiftCopyActivity" }]}

0

вы в состоянии SSH в кластер? Если это так, я бы предложил написать сценарий оболочки, где вы можете создавать переменные и whatnot, а затем передавать эти переменные в запрос-запрос соединения

Смежные вопросы