2016-09-16 127 views
0

我已經有多個紅移腳本卸載語句紅移卸載腳本

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腳本時,是否有更簡單的方法來傳遞參數?

在此先感謝您的幫助!

回答

1

無法將參數傳遞給UNLOAD命令。

PREPARE聲明僅適用於SELECT,或DELETE

您需要在之前將命令插入所需參數,然後將其發送到Redshift。這可以從一個bash腳本來完成這樣的:

psql ... "UNLOAD (SELECT * FROM ... WHERE date = '`date +%Y%m%d`')..." 

這將替代當前日期(date +%Y%m%d)作爲查詢的一部分。

0

您可以使用bash腳本將參數傳遞給unload語句。從訪問Redshift數據庫集羣的邊緣節點爲您的Redshift實例調用'psql'並使用'-v'參數。

例如:在bash腳本正在調用SQL腳本:

$> 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腳本,你可以參考傳遞的變量爲:RS_Script_Unload_Stmt。所以,你可以在你的SQL腳本創建卸載:

UNLOAD (:RS_Script_Unload_Stmt) TO 's3://test-bucket/products/:date_var/prod_' CREDENTIALS 'XXXX' DELIMITER AS '|' parallel off; 
0

嘗試使腳本本身進行必要的修改,而不是包括unload聲明的東西。

我所做的是:

aws s3 mv s3://[bucket_name]/"$file_name".csv000 s3://[bucket_name]/"$file_name$from_date".csv

它所做的是:

  1. 填充鬥S3上與您unload語句生成的文件。
  2. 重命名(move)附加日期/時間戳到文件名的文件。

這裏,$from_date是一個變量,初始化爲date --date='1 days ago' +'%Y-%m-%d';