8

sqlActivity でスクリプト引数を使用しようとすると、次のようになります。

 {
"id" : "ActivityId_3zboU",
  "schedule" : { "ref" : "DefaultSchedule" },
  "scriptUri" : "s3://location_of_script/unload.sql",
  "name" : "unload",
  "runsOn" : { "ref" : "Ec2Instance" },
  "scriptArgument" : [ "'s3://location_of_unload/#format(minusDays(@scheduledStartTime,1),'YYYY/MM/dd/hhmm/')}'", "'aws_access_key_id=????;aws_secret_access_key=*******'" ],
  "type" : "SqlActivity",
  "dependsOn" : { "ref" : "ActivityId_YY69k" },
  "database" : { "ref" : "RedshiftCluster" }
}

unload.sql スクリプトの内容は次のとおりです。

 unload ('
    select *
    from tbl1 
 ')  
 to ?
 credentials  ?
 delimiter ',' GZIP;

また :

 unload ('
    select *
    from tbl1 
 ')  
 to ?::VARCHAR(255)
 credentials  ?::VARCHAR(255) 
 delimiter ',' GZIP;

プロセスは失敗します:

syntax error at or near "$1" Position

私が間違っていることは何ですか?

4

3 に答える 3

5

これは psql shell から正常に動作するスクリプトです:

insert into tempsdf select * from source where source.id = '123';

Data-Pipelines を使用したSqlActivityでの私のテストの一部を次に示します。


テスト 1 : ?

insert into mytable select * from source where source.id = ?;- SqlActivity オブジェクトの「script」オプションと「scriptURI」オプションの両方で使用すると正常に動作します。

どこ"ScriptArgument" : "123"

ここ ?条件の値を置き換えることはできますが、条件自体を置き換えることはできません。


テスト 2 : 'script' オプションのみを使用してコマンドを指定すると、パラメーターの使用が機能する

insert into #{myTable} select * from source where source.id = ?;- 「スクリプト」オプションのみを介して使用する場合は正常に動作します

insert into #{myTable} select * from source where source.id = #{myId};
  • 「スクリプト」オプションのみで使用すると正常に動作します

ここで#{myTable}#{myId}は、値をテンプレートで宣言できるパラメーターです。

http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-custom-templates.html

(パラメーターのみを使用している場合は、未使用の scriptArguments を必ず削除してください。そうしないと、スローしてエラーが発生します)


失敗したテストと推論:

に挿入しますか?select * from source where source.id = ?;

に挿入しますか?select * from source where source.id = '123';

上記のコマンドはどちらも機能しません。

スクリプト引数のプレースホルダーにテーブル名を使用することはできません。「?」は、比較条件の値と列の値を渡すためにのみ使用できます。


insert into #{myTable} select * from source where source.id = #{myId}; - 「SciptURI」として使用すると機能しません

insert into tempsdf select * from source where source.id = #{myId}; - 「ScriptURI」と一緒に使用すると機能しません

上記の 2 つのコマンドは機能しません。

スクリプトが S3 に格納されている場合、パラメータを評価できません。


insert into tempsdf select * from source where source.id = $1 ; -「scriptURI」では機能しません

tempsdf 値 ($1、$2、$3) に挿入します。- 動作しません。

$ の使用 - どの組み合わせでも機能しません


その他のテスト:

"ScriptArgument" : "123" "ScriptArgument" : "456" "ScriptArgument" : "789"

insert into tempsdf values (?,?,?);- scriptURI 、スクリプト、および変換の両方として機能しますinsert into tempsdf values ('123','456','789');

scriptArguments は挿入した順序に従い、「?」を置き換えます。スクリプトで。


于 2016-03-02T23:39:20.250 に答える
1

シェルコマンド アクティビティでは、シェル スクリプト (.sh) で $1 $2 を使用してアクセスする 2 つの scriptArguments を指定します。

"scriptArgument" : "'s3://location_of_unload/#format(minusDays(@scheduledStartTime,1),'YYYY/MM/dd/hhmm/')}'", # $1 を使用してアクセスできます "scriptArgument" : "' aws_access_key_id=????;aws_secret_access_key=*******'" # $2 を使用してアクセスできます

これがうまくいくかわかりません。

于 2014-12-23T08:34:56.310 に答える
0

この sql アクティビティを Redshift に使用していると思います。位置表記を使用してパラメーターを参照するように SQL スクリプトを変更できますか。SQL ステートメント自体のパラメーターを参照するには、$1、$2 などを使用します。

http://www.postgresql.org/docs/9.1/static/sql-prepare.htmlを参照してください。

于 2014-12-16T01:23:35.627 に答える