LanguageManual - 변수 치환

LanguageManual - 변수 치환 (Variable Substitution)

환경별 구성 값을 코드에서 분리하고 싶을 때 쓰는 Hive의 변수 치환 기능을 설명해요. hiveconf·system·env라는 세 가지 네임스페이스와 ${...} 문법으로 쿼리에 변수를 적용하는 방법을 다룹니다.

출처: 문서

본문

소개 (Introduction)

Hive는 배치와 대화형 쿼리에 사용됩니다. 변수 치환(Variable Substitution)은 환경별 구성 변수를 코드에서 분리하는 것 같은 작업을 가능하게 해줍니다.

Hive의 변수 치환 메커니즘은 Hive 위의 스크립팅 언어에 박혀 들어가던 일부 코드를 피하려고 설계되었습니다.

스크립트 내부에서 변수를 설정하려고 다음 같은 셸 명령을 (비효율적으로) 사용할 수 있습니다:

$ a=b
$ hive -e " describe $a "

이것은 Hive가 스크립팅 언어와 밀접하게 결합되어 실망스럽습니다. 수천 번의 hive -e 호출 같은 조작을 할 때 Hive 시작 시간(몇 초)은 무시할 수 없는 수준입니다.

Hive Variables는 여러분이 알고 사랑하는 set 기능과 제한적이지만 강력한 치환 기능을 결합합니다.

다음 예제:

$ bin/hive --hiveconf a=b -e 'set a; set hiveconf:a; \
create table if not exists b (col int); describe ${hiveconf:a}'

다음과 같은 결과가 나옵니다:

Hive history file=/tmp/edward/hive_job_log_edward_201011240906_1463048967.txt
a=b
hiveconf:a=b
OK
Time taken: 5.913 seconds
OK
col	int
Time taken: 0.754 seconds

Hive 커맨드 라인 옵션에 대한 일반적인 정보는 Hive CLI를 참고하세요.

버전 정보

hiveconf 옵션은 0.7.0 버전(JIRA HIVE-1096)에서 추가되었습니다. 0.8.0 버전에서 definehivevar 옵션(JIRA HIVE-2020)이 추가되었는데, 이 둘은 동등하며 여기서 설명하지 않습니다. 이 옵션들은 hiveconf, system, env 네임스페이스와 분리된 네임스페이스에 사용자 정의 변수를 만듭니다.

변수 사용 (Using Variables)

변수에는 hiveconf, system, env 세 가지 네임스페이스가 있습니다. (Hive 0.8.0 이후 릴리스에서는 define 또는 hivevar 옵션으로 별도 네임스페이스에 사용자 정의 변수를 만들 수도 있습니다.)

hiveconf 변수는 일반적으로 설정됩니다:

set x=myvalue

하지만 다음과 같이 검색합니다:

${hiveconf:x}

테스트 케이스 ql/src/test/queries/clientpositive/set_processor_namespaces.q의 주석 처리된 사용 예시:

set zzz=5;
--  sets zzz=5
set zzz;

set system:xxx=5;
set system:xxx;
-- sets a system property xxx to 5

set system:yyy=${system:xxx};
set system:yyy;
-- sets yyy with value of xxx

set go=${hiveconf:zzz};
set go;
-- sets go base on value on zzz

set hive.variable.substitute=false;
set raw=${hiveconf:zzz};
set raw;
-- disable substitution set a value to the literal

set hive.variable.substitute=true;

EXPLAIN SELECT * FROM src where key=${hiveconf:zzz};
SELECT * FROM src where key=${hiveconf:zzz};
--use a variable in a query

set a=1;
set b=a;
set c=${hiveconf:${hiveconf:b}};
set c;
--uses nested variables.

set jar=../lib/derby.jar;

add file ${hiveconf:jar};
list file;
delete file ${hiveconf:jar};
list file;

쿼리 구성 중 치환 (Substitution During Query Construction)

Hive는 변수를 사용해 쿼리를 구성할 때 해당 변수의 값을 치환합니다.

  • 두 개의 다른 Hive 세션을 실행해도 변수 값은 세션 간에 섞이지 않습니다.
  • 같은 Hive 세션에서 같은 이름의 변수를 설정하면 쿼리는 마지막에 설정한 값을 사용합니다.

변수 치환 비활성화 (Disabling Variable Substitution)

변수 치환은 기본적으로 켜져 있습니다(hive.variable.substitute=true). 기존 스크립트에서 문제가 생기면 다음 명령으로 비활성화하세요:

set hive.variable.substitute=false;

더 알아보기 (Learn more)

변수는 hiveconf, system, env 세 네임스페이스로 나뉘고, ${hiveconf:name} 같은 형태로 치환돼요. set으로 값을 지정하고, hive.variable.substitute 설정으로 치환을 끌 수도 있습니다. 셸과 Hive를 느슨하게 결합해 스크립트를 재사용하는 데 도움이 됩니다.