SET varname = value
Hive QL에 해당하는 SQL을 찾고 있습니다.
다음과 같이 할 수 있습니다.
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
하지만 다음 오류가 발생합니다.
여기에서는 '@'문자가 지원되지 않습니다.
SET varname = value
Hive QL에 해당하는 SQL을 찾고 있습니다.
다음과 같이 할 수 있습니다.
SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE
하지만 다음 오류가 발생합니다.
여기에서는 '@'문자가 지원되지 않습니다.
답변:
변수 대체를 위해 특수 hiveconf 를 사용해야합니다 . 예 :
hive> set CURRENT_DATE='2012-09-16';
hive> select * from foo where day >= '${hiveconf:CURRENT_DATE}'
마찬가지로 명령 줄에서 전달할 수 있습니다.
% hive -hiveconf CURRENT_DATE='2012-09-16' -f test.hql
이 참고 것을 ENV 및 시스템 참조 할 수 있도록 변수뿐만 아니라, ${env:USER}
예를 들면.
사용 가능한 모든 변수를 보려면 명령 줄에서 다음을 실행합니다.
% hive -e 'set;'
또는 하이브 프롬프트에서
hive> set;
업데이트 : 명령을 사용하여 hive CLI에서 포함 할 수있는 hql 스 니펫에 hivevar 변수도
사용하기 시작했습니다 source
(또는 명령 줄에서 -i 옵션으로 전달). 여기서의 이점은 변수를 hivevar 접두사와 함께 사용하거나 사용하지 않고 사용할 수 있으며 전역 및 로컬 사용과 유사한 것을 허용한다는 것입니다.
따라서 tablename 변수를 설정하는 setup.hql 이 있다고 가정 하십시오.
set hivevar:tablename=mytable;
그런 다음 하이브로 가져올 수 있습니다.
hive> source /path/to/setup.hql;
쿼리에서 사용 :
hive> select * from ${tablename}
또는
hive> select * from ${hivevar:tablename}
또한 $ {tablename} 사용에 영향을주는 "로컬"테이블 이름을 설정할 수도 있지만 $ {hivevar : tablename}에는 영향을주지 않습니다.
hive> set tablename=newtable;
hive> select * from ${tablename} -- uses 'newtable'
vs
hive> select * from ${hivevar:tablename} -- still uses the original 'mytable'
아마도 CLI에서 너무 많은 것을 의미하지는 않지만 source 를 사용하는 파일에 hql을 가질 수 있지만 나머지 스크립트에서 사용할 변수 중 일부를 "로컬"로 설정합니다.
set CURRENT_DATE='2012-09-16';
당신이 나중에 참조 할 수${hiveconf:CURRENT_DATE}
FAILED: ParseException line x:y cannot recognize input near '$' '{' 'hiveconf' in expression specification
여기에있는 대부분의 답변은 hiveconf
또는 hivevar
네임 스페이스를 사용하여 변수를 저장 하도록 제안했습니다 . 그리고 그 모든 대답은 옳습니다. 그러나 네임 스페이스가 하나 더 있습니다.
namespaces
보유 변수 에는 총 3 가지가 있습니다.
따라서 쿼리의 일부로 변수를 저장하는 경우 (예 : date 또는 product_number) hivevar
네임 스페이스가 아닌 hiveconf
네임 스페이스 를 사용해야 합니다.
그리고 이것이 작동하는 방식입니다.
hiveconf 는 여전히 기본 네임 스페이스 이므로 네임 스페이스를 제공하지 않으면 변수가 hiveconf 네임 스페이스에 저장됩니다.
그러나 변수를 참조 할 때는 사실이 아닙니다. 기본적으로 hivevar 네임 스페이스 를 참조 합니다. 혼란 스럽죠? 다음 예제를 통해 더 명확해질 수 있습니다.
아래와 같이 네임 스페이스 를 제공 하지 않으면 네임 스페이스 에 변수 var
가 저장됩니다 hiveconf
.
set var="default_namespace";
따라서 여기에 액세스하려면 네임 스페이스 를 지정해야 hiveconf
합니다.
select ${hiveconf:var};
당신이 만약 네임 스페이스를 제공하지 않는 이유는 기본적으로 당신이 변수 그것을 검사에 액세스하려고하면 것을되고, 아래에 언급 한 바와 같이 그것은 당신에게 오류를 줄 것이다 hivevar
유일한 공간. 그리고 hivevar
이름이 지정된 변수가 없습니다.var
select ${var};
hivevar
네임 스페이스를 명시 적으로 제공했습니다.
set hivevar:var="hivevar_namespace";
네임 스페이스를 제공하므로 이것이 작동합니다.
select ${hivevar:var};
그리고 기본적으로 변수를 참조하는 동안 사용되는 작업 공간은 hivevar
이며, 다음도 작동합니다.
select ${var};
다음 과 같이 달러 기호 와 대괄호를 사용해 보셨습니까?
SELECT *
FROM foo
WHERE day >= '${CURRENT_DATE}';
두 가지 쉬운 방법 :
하이브 구성 사용
hive> set USER_NAME='FOO';
hive> select * from foobar where NAME = '${hiveconf:USER_NAME}';
하이브 변수 사용
CLI에서 vars를 설정 한 다음 하이브에서 사용
set hivevar:USER_NAME='FOO';
hive> select * from foobar where NAME = '${USER_NAME}';
hive> select * from foobar where NAME = '${hivevar:USER_NAME}';
문서 : https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VariableSubstitution
다른 쿼리의 출력을 변수에 저장할 수 있으며 후자는 코드에서 동일하게 사용할 수 있습니다.
set var=select count(*) from My_table;
${hiveconf:var};