2017-11-01 2 views
1

変数の値を文字列に連結する際に問題が発生しています。 私のスクリプトは上記でハイブ変数の連結

set hivevar:tab_dt= substr(date_sub(current_date,1),1,10); 

CREATE TABLE default.udr_lt_bc_${hivevar:tab_dt} 
(
trans_id double 
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","; 

の下に含まれ、変数tab_dtはYYYYMMDD形式で昨日の日付で正しく割り当てられます。 しかし、静的な文字列でテーブル名にこの変数を連結しようとすると、スクリプトは失敗します。連結を行っていません。 問題なく解決策を提供します。

注:私はあまりにもあまりにも

set hivevar:tab_dt= substr(date_sub(current_date,1),1,10); 
set hivevar:tab_nm1= default.udr_lt_bc_; 
set hivevar:tab_name= concat(${hivevar:tab_dt},${hivevar:tab_nm1}) 

CREATE TABLE ${hivevar:tab_name} 
(
trans_id double 
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","; 

これをerroringされ、あまりにも以下試してみましたが、エラーを返しています。

答えて

0

ハイブは変数内の式を計算せず、そのまま代入します。 あなたの本でテーブル式の結果を作成します。この中

CREATE TABLE default.udr_lt_bc_substr(date_sub(current_date,1),1,10)... 

あなたの第二の発現結果:

CREATE TABLE concat(substr(date_sub(current_date,1),1,10),default.udr_lt_bc_) 

残念ながらハイブは、DDLでこのような表現をサポートしていません。

この変数をシェルで計算し、ハイブスクリプトに--hivevarとして渡すことをお勧めします。 '-'が、私は'_'を使用した理由つまり、テーブル名に許可されていないことを

CREATE TABLE default.${hivevar:table_name} 

注:変数を使用することができますyour_scriptで

table_name=udr_lt_bc_$(date +'%Y_%m_%d' --date "-1 day") 
#table_name is udr_lt_bc_2017_10_31 now 
#call your script 
hive -hivevar table_name="$table_name" -f your_script.hql 

そして:販売スクリプトの例については

代わりに。

ハイブは、変数を置換する方法をより良く理解するために、これを試してください:最初のSELECT文で変数を置換したことを

hive> set hivevar:tab_dt= substr(date_sub(current_date,1),1,10); 
hive> select ${hivevar:tab_dt}; 
OK 
2017-10-31 
Time taken: 1.406 seconds, Fetched: 1 row(s) 
hive> select '${hivevar:tab_dt}'; 
OK 
substr(date_sub(current_date,1),1,10) 
Time taken: 0.087 seconds, Fetched: 1 row(s) 

注意を実行する前にあり、その後、SQLで計算しました。 2番目のSELECTステートメントは、変数が引用され、そのままのままであるため、計算を妨げます。substr(date_sub(current_date,1),1,10)

+0

詳細なコメントはleftjoinありがとうございます。 – Sandeep

+0

詳細なコメントはleftjoinありがとうございます。それは非常に参考になりました。実際にはシェルスクリプトで試してみましたが、コマンドラインからshファイルを実行するとうまくいきました。しかし、私がおなじワークフローから同じファイルを呼び出すと、shファイルのハイブセクションが実行されていません。私のハイブの質問はあなたが言ったこととまったく同じでした。シェルスクリプトで変数を割り当てた後、ハイブと同じスクリプトでハイブを起動します。-hivevar table_name = "$ table_name" -f your_script.hql。次に、この.shファイルをoozieのシェル・アクションとして実行します。なぜこれが起こっているのか知っていますか? – Sandeep

+0

@Sandeep私はあなたのスクリプトとoozie設定でもう1つの質問を投稿することをお勧めします – leftjoin