Amazon Data Pipeline:如何在SqlActivity中使用脚本参数?

时间:2014-12-15 09:49:38

标签: amazon-web-services amazon-s3 amazon-redshift amazon-data-pipeline

尝试在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

知道我做错了吗?

3 个答案:

答案 0 :(得分:4)

这是从psql shell运行良好的脚本:

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

以下是我使用数据管道对 SqlActivity 进行的一些测试:

测试1 :使用&#39>

insert into mytable select * from source where source.id = ?; - 如果通过'脚本使用,则可以正常使用'和' scriptURI' SqlActivity对象上的选项。

其中"ScriptArgument" : "123"

在这里?可以替换条件的值,但不能替换条件本身。

测试2:当使用'脚本'指定命令时,使用参数有效。仅限选项

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 from source where source.id =?;

插入?从source中选择*,其中source.id =' 123';

上述两个命令都不起作用,因为

  

表名不能用于脚本参数的占位符。 '?''只能用于传递比较条件和列值的值。

从源代码中插入#{myTable} select *,其中source.id =#{myId}; - 如果用作' SciptURI'

从源中插入tempsdf select *,其中source.id =#{myId}; - 与'' ScriptURI'一起使用时不起作用

以上2个命令不起作用,因为

  

如果脚本存储在S3中,则无法评估参数。

从源中插入tempsdf select *,其中source.id = $ 1; - 无法使用' scriptURI'

插入tempsdf值($ 1,$ 2,$ 3); - 不起作用。

  

使用$' s - 不能以任何组合工作

其他测试:

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

insert into tempsdf values (?,?,?); - 兼作scriptURI,脚本并转换为insert into tempsdf values ('123','456','789');

  

scriptArguments将遵循您插入的顺序并替换"?"在   脚本。

答案 1 :(得分:1)

shell命令活动中的

我们在shell脚本(.sh)中使用$ 1 $ 2指定两个要访问的scriptArguments

" scriptArgument" :"' s3:// location_of_unload / #format(minusDays(@ scheduledStartTime,1),' YYYY / MM / dd / hhmm /')}'&# 34;,#可以使用$ 1加入 " scriptArgument" :"' aws_access_key_id = ????; aws_secret_access_key = *******'" #可以使用$ 2

加入

我不知道这对你有用。

答案 2 :(得分:0)

我相信你正在使用这个sql活动进行Redshift。你能修改你的sql脚本,使用它们的位置表示法来引用参数。 要引用sql语句本身中的参数,请使用$ 1,$ 2等

请参阅http://www.postgresql.org/docs/9.1/static/sql-prepare.html