Redshift卸载脚本

时间:2016-09-16 18:57:08

标签: shell amazon-redshift

我有一个包含多个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脚本时,是否有更简单的方法来传递参数。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

无法将参数传递给UNLOAD命令。

PREPARE语句仅适用于SELECTINSERTUPDATEDELETE

将命令发送到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

它的作用是:

  1. 使用unload语句生成的文件在s3上填充存储桶。
  2. 将附加日期/时间戳的文件重命名(move)到文件名。
  3. 此处,$from_date是一个变量,初始化为date --date='1 days ago' +'%Y-%m-%d';