我有一个包含多个redshift卸载语句的脚本
UNLOAD('SELECT * FROM test.products WHERE product_name LIKE \'%20160912%\'')
TO 's3://test-bucket/products/20160912/prod_'
CREDENTIALS 'XXXX'
DELIMITER AS '|' parallel off;
有多个这样的陈述。我想参数化日期并传递我运行此脚本的日期。我怎么能这样做?
脚本就像这样
UNLOAD('SELECT * FROM test.products WHERE product_name LIKE \'%${DATE}%\'')
TO 's3://test-bucket/products/${DATE}/prod_'
CREDENTIALS 'XXXX'
DELIMITER AS '|' parallel off;
运行脚本时有没有办法替换$ {DATE}。我知道Redshift中有PREPARE,但我的想法是它无法使用Unload语句。另一种选择是编写shell脚本并让shell脚本调用此SQL脚本。但是,从命令行运行SQL脚本时,是否有更简单的方法来传递参数。
提前感谢您的帮助!
答案 0 :(得分:1)
无法将参数传递给UNLOAD
命令。
PREPARE
语句仅适用于SELECT
,INSERT
,UPDATE
或DELETE
。
在将命令发送到Redshift之前,您需要将所需的参数插入到命令中。这可以通过这样的bash脚本完成:
psql ... "UNLOAD (SELECT * FROM ... WHERE date = '`date +%Y%m%d`')..."
这将替换当前日期(date +%Y%m%d
)作为查询的一部分。
答案 1 :(得分:0)
您可以使用bash脚本将参数传递给unload语句。打电话给psql'对于来自访问Redshift数据库集群的边缘节点的Redshift实例,并使用' -v'参数。
例如:在调用SQL脚本的Bash脚本中:
$> curr_date=$(date +%F)
$> select_of_unload_stmt='SELECT * from myTable where column like \'$curr_date\''
$> psql -h <HostName> -p <Port_Number> -d <Database_Name> -U <User> -v RS_Script_Unload_Stmt="$select_of_unload_stmt" -v date_var="$curr_date" -f <Script_Containing_RS_Unload_Query.SQL>
在SQL Script中,您可以将传递的变量引用为:RS_Script_Unload_Stmt。因此,您可以在SQL脚本中创建卸载:
UNLOAD (:RS_Script_Unload_Stmt) TO 's3://test-bucket/products/:date_var/prod_' CREDENTIALS 'XXXX' DELIMITER AS '|' parallel off;
答案 2 :(得分:0)
尝试在脚本中进行必要的更改,而不是在unload
语句中包含某些内容。
我做的是:
aws s3 mv s3://[bucket_name]/"$file_name".csv000 s3://[bucket_name]/"$file_name$from_date".csv
它的作用是:
unload
语句生成的文件在s3上填充存储桶。move
)到文件名。此处,$from_date
是一个变量,初始化为date --date='1 days ago' +'%Y-%m-%d'
;