0

私は今やS3にファイルをダンプしてからアナライザを許可するのが簡単になるように、RedshiftでUNLOADのステートメントをしばらく使っています。Amazon 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がまだアクティブではありません)現在利用できるインフラストラクチャと、このようなタスクを自動化する方法を任意の他のオプションを持っています。

私は仕事ができると思った(しかし、わからない)唯一のものは、(それがファイルを指した瞬間に)SQLActivityScriptオプションにスクリプトをコピーして参照するために、スクリプトを使用するのではなくではありません{@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"、 "resourceRole": "DataPipelineDefaultResourceRole" }、{ "ID": "RedshiftDataNodeId1"、 "スケジュール":{ "REF": "ScheduleId1" }、 "tableNameの": "オーダー"、 "名前": "DefaultRedshiftDataNode1" 、 "タイプ": "RedshiftDataNode"、 "データベース":{ "ref": "RedshiftDatabaseId1" } }、{ "ID": "Ec2ResourceId1"、 "スケジュール":{ "REF": "ScheduleId1" }、 "securityGroups": "MySecurityGroup"、 "名前": "DefaultEc2Resource1"、 "役割" " DataPipelineDefaultRole " "logUri": "S3:// myLogs"、 "resourceRole": "DataPipelineDefaultResourceRole"、 は "タイプ": "Ec2Resource" }、{ "myComment":" このオブジェクトを制御するために使用されます"id": "DefaultSchedule1"、 "名前": "RunOnce"、 "発生" 、 "startAt": "FIRST_ACTIVATION_DATE_TIME" }、{ "ID": "S3DataNodeId1"、 "スケジュール":{ "REF": "ScheduleId1" }、 "directorypathに":「S3:// my-バケット/#{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で接続することができますか?もしそうなら、私は、変数とそれ以外のものを作成し、それらの変数を接続の文に渡すことができるシェルスクリプトを書くことを提案する - クエリ