HIVE 스크립트에서 변수를 설정하는 방법


102

SET varname = valueHive QL에 해당하는 SQL을 찾고 있습니다.

다음과 같이 할 수 있습니다.

SET CURRENT_DATE = '2012-09-16';
SELECT * FROM foo WHERE day >= @CURRENT_DATE

하지만 다음 오류가 발생합니다.

여기에서는 '@'문자가 지원되지 않습니다.


불행히도 문자열 변수를 설정하는 안전한 방법은 없습니다. 누군가 변수를 설정하지 않고 쿼리를 실행하면 문자열이 단순히 변수 호출을 문자열로 사용하기 때문입니다. :(
combinatorist

답변:


201

변수 대체를 위해 특수 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을 가질 수 있지만 나머지 스크립트에서 사용할 변수 중 일부를 "로컬"로 설정합니다.


1
이것은 명령 줄에서 매개 변수를 전달하는 것입니다. Karmasphere에서 쿼리를 개발 중이며 스크립트에서 날짜를 10 번 하드 코딩하지 않도록 몇 가지 상수를 설정해야합니다. 그게 가능합니까?
user1678312

당신이 할 경우, 두 가지 작동 set CURRENT_DATE='2012-09-16';당신이 나중에 참조 할 수${hiveconf:CURRENT_DATE}
libjack

1
여러 Hive 작업이 동시에 실행되는 경우 어떻게 작동합니까? 그들은 서로로부터 가치를 얻게 될까요? 자동화에서는 일부 SET 문을 앞에 추가하여 HQL 파일을 구성하고 있습니다. 동일한 변수 이름을 사용하는 두 개의 작업을 동시에 제출하면 한 작업이 다른 작업에서 값을 가져 오지 않도록하고 싶습니다. 여기의 의미는 귀하의 답변에서 명확하지 않습니다.
MattD 2014

5
이것은 Hive 서버에서 나를 위해 작동합니다. 그러나 IntelliJ의 로컬 컴퓨터에서 몇 가지 통합 테스트를 설정했습니다. 이런 식으로 변수를 사용하려고하면 다음과 같은 오류가 계속 발생합니다.FAILED: ParseException line x:y cannot recognize input near '$' '{' 'hiveconf' in expression specification
chepukha

1
@DatabaseCoder 내가 아는 한, 그와 같은 것은 작동하지 않습니다. 이와 같은 것이 필요할 때마다 첫 번째 쿼리를 수행 한 다음 "--hiveconf"를 통해 전달해야합니다.
libjack

21

여기에있는 대부분의 답변은 hiveconf또는 hivevar네임 스페이스를 사용하여 변수를 저장 하도록 제안했습니다 . 그리고 그 모든 대답은 옳습니다. 그러나 네임 스페이스가 하나 더 있습니다.

namespaces보유 변수 에는 총 3 가지가 있습니다.

  1. hiveconf- 하이브가 시작되면 모든 하이브 구성이이 conf의 일부로 저장됩니다. 처음에는 변수 대체가 하이브의 일부가 아니었고 도입되었을 때 모든 사용자 정의 변수도 이것의 일부로 저장되었습니다. 확실히 좋은 생각이 아닙니다. 그래서 두 개의 네임 스페이스가 더 만들어졌습니다.
  2. hivevar : 사용자 변수 저장
  3. system : 시스템 변수를 저장합니다.

따라서 쿼리의 일부로 변수를 저장하는 경우 (예 : 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};

7

다음 과 같이 달러 기호대괄호를 사용해 보셨습니까?

SELECT * 
FROM foo 
WHERE day >= '${CURRENT_DATE}';

이것은 나에게 유일한 해결책입니다. 내 ambari 하이브 인터페이스에 따옴표가 필요합니다.
Laurens Koppenol

이 두 가지 hivevar하고 모두가 자세히 설명되어 있습니다 hiveconf- 여기
라훌 샤르마

3

두 가지 쉬운 방법 :

하이브 구성 사용

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


2

염두에 두어야 할 한 가지는 문자열을 설정 한 다음 다시 참조하는 것입니다. 따옴표가 충돌하지 않는지 확인해야합니다.

 set start_date = '2019-01-21';
 select ${hiveconf:start_date}; 

날짜를 설정할 때 문자열이 충돌 할 수 있으므로 코드에서 날짜를 참조하십시오. 위의 start_date 설정에서는 작동하지 않습니다.

 '${hiveconf:start_date}'

쿼리에서 다시 참조 할 때 문자열에 대해 작은 따옴표 나 큰 따옴표를 두 번 설정하지 않도록주의해야합니다.


2

누군가가 cli를 통해 하이브 쿼리를 매개 변수화해야하는 경우를 대비하여.

예 :

hive_query.sql

SELECT * FROM foo WHERE day >= '${hivevar:CURRENT_DATE}'

이제 cli에서 위의 sql 파일을 실행하십시오.

hive --hivevar CURRENT_DATE="2012-09-16" -f hive_query.sql

0

이 방법을 시도하십시오.

set t=20;
select *
from myTable
where age > '${hiveconf:t}'; 

내 플랫폼에서 잘 작동합니다.


0

쉘 스크립트 export CURRENT_DATE = "2012-09-16"에서 변수를 내보낼 수 있습니다.

그런 다음 hiveql에서 SELECT * FROM foo WHERE day> = '$ {env : CURRENT_DATE}'를 좋아합니다.


-7

다른 쿼리의 출력을 변수에 저장할 수 있으며 후자는 코드에서 동일하게 사용할 수 있습니다.

set var=select count(*) from My_table;
${hiveconf:var};

렸습니다. My_table에서 count (*)를 선택하십시오. var에 저장됩니다 .
Ilya Bystrov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.