2017-11-01 1 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} 

, 즉 :

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 

그리고 your_script에 당신이 변수를 사용할 수 있습니다 대신.

하이브 변수를 대체하는 방법을 더 나은 이해를 위해,이 시도 : 첫 번째 선택 문에 변수가 교체 된 것을

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에서 계산한다. 두 번째 select 문은 변수가 따옴표로 묶여 그대로 유지되므로 계산을 막습니다. substr(date_sub(current_date,1),1,10).

+0

자세한 코멘트를 남겨 주셔서 감사합니다. – Sandeep

+0

자세한 코멘트를 남겨 주셔서 감사합니다. 그것을 발견 매우 도움이. 사실 쉘 스크립트에서 시도해 보았고 명령 행에서 sh 파일을 실행할 때 잘 작동했습니다. 그러나 oozie 워크 플로에서 같은 파일을 호출하면 sh 파일의 하이브 섹션이 실행되고 있지 않습니다. 내 하이브 쿼리는 당신이 언급 한 것과 정확히 유사합니다. 쉘 스크립트에서 변수를 할당 한 다음 하이브 - hivevar table_name = "$ table_name"-f your_script.hql과 동일한 스크립트에서 하이브를 호출합니다. 그런 다음이 .sh 파일을 oozie의 쉘 조치로 실행합니다. 왜 이런 일이 일어 났는지 알아? – Sandeep

+0

@Sandeep 스크립트와 설정으로 한 가지 더 질문을 올리시기 바랍니다. – leftjoin